Как сделать сумму SUM () цикла? - PullRequest
1 голос
/ 08 ноября 2019

Мне нужно сделать цикл, который суммирует следующие X строк, пока не достигнет Column_Key <> (X Row Column_Key) ИЛИ (X Row Key_2) NOT IN ('18', '19').

Слева у меня есть ключи, которые являются отдельными пользователями. Я думаю, что мне нужно сделать цикл для каждого уникального ключа;93246499, 93246616, 93246697 и 93246831. У каждого из них есть связанный с ними транскод:

Code 36 = Charge
Code18 = Paid
Code 15 & 31 = Waive

Я хочу, чтобы каждый экземпляр кода 36 (заряд) смотрел на следующую строку (яв настоящее время, используя lead () для даты оплаты) и определите, отличается ли транскод. Вот различные сценарии: Во всех приведенных ниже примерах это по ключу, если ключом является <> строка 1 ключа, тогда он останавливается на этом шаге.

Row 1 Code 36 Row 2 Code 36 = Stop and count as UnPaid (this is already setup)
Row 1 Code 36 Row 2 Code 15, 31 = Set Waive Amount to the Late Amount (this is already setup).

строка 1 Код 36 строка 2Код 18, 19 = Продолжайте поиск в следующей строке, пока не достигнете Код 15, 31 или 36 и СУММА последних столбцов. ЕСЛИ мы достигаем код 15 или 31, затем устанавливаем сумму отказа в размере суммы за опоздание. Как только это будет сделано, я планирую выполнить SELECT * FROM #TEST WHERE Trans_Code = 36, чтобы в каждом из 36 были выбраны соответствующие поля.

У меня естьсделал это в длинном преувеличенном операторе CASE, но в нем отсутствует некоторый код для обработки различных экземпляров Loan_Key, и он не прерывается, если Trans_Code отсутствует в (18, 19) и просто продолжает их складывать.

SELECT *
      ,CASE WHEN LEAD([Loan Key], 1) OVER(PARTITION BY [Loan Key] ORDER BY [Date]) = [Loan Key] THEN 
            CASE WHEN LEAD(TRANS_CODE, 1) OVER(PARTITION BY [Loan Key] ORDER BY [Date]) IN ('18', '19') THEN [Amount Paid] + LEAD([NSF Charge], 1) OVER(PARTITION BY [Loan Key] ORDER BY [Date]) + ISNULL(
                 CASE WHEN LEAD([Loan Key], 2) OVER(PARTITION BY [Loan Key] ORDER BY [Date]) = [Loan Key] THEN
                      CASE WHEN LEAD(TRANS_CODE, 2) OVER(PARTITION BY [Loan Key] ORDER BY [Date]) IN ('18', '19') THEN LEAD([NSF Charge], 2) OVER(PARTITION BY [Loan Key] ORDER BY [Date]) + ISNULL(
                           CASE WHEN LEAD([Loan Key], 3) OVER(PARTITION BY [Loan Key] ORDER BY [Date]) = [Loan Key] THEN
                                CASE WHEN LEAD(TRANS_CODE, 3) OVER(PARTITION BY [Loan Key] ORDER BY [Date]) IN ('18', '19') THEN LEAD([NSF Charge], 3) OVER(PARTITION BY [Loan Key] ORDER BY [Date]) + ISNULL(
                                     CASE WHEN LEAD([Loan Key], 4) OVER(PARTITION BY [Loan Key] ORDER BY [Date]) = [Loan Key] THEN
                                          CASE WHEN LEAD(TRANS_CODE, 4) OVER(PARTITION BY [Loan Key] ORDER BY [Date]) IN ('18', '19') THEN LEAD([NSF Charge], 4) OVER(PARTITION BY [Loan Key] ORDER BY [Date])
                                               ELSE 0
                                           END
                                      END, 0)
                                     ELSE 0
                                 END
                            END, 0)
                           ELSE 0
                       END
                  END, 0)
                 ELSE 0 END
            ELSE 0
        END
  FROM #Test
 WHERE [Loan Key] = '93246916' --AND TRANS_CODE = '36'

Редактировать: я не могу публиковать изображения, поэтому вот текстовый пример ... Пример данных:

Key   Date         Code        Paid
1     10/1/2018     36          0
1     11/1/2018     18          1
1     11/30/2018    18          10
1     1/1/2019      19          20
1     5/1/2019      36          0
1     6/1/2019      36          10
1     7/1/2019      36          10
2     11/1/2018     36          0
2     1/1/2019      18          10
2     2/1/2019      36          0
2     3/1/2019      36          0
2     4/1/2019      36          0
2     5/1/2019      18          50

Ожидаемый результат:

Показывать только результаты для кода 36, Дата равнапоследняя оплаченная дата (код 18 или 19)

Key    Date        Code       Paid
1      1/1/2019    36         31
1      5/1/2019    36         0
1      6/1/2019    36         10
1      7/1/2019    36         10
2      1/1/2019    36         10
2      2/1/2019    36         0
2      3/1/2019    36         0
2      5/1/2019    36         50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...