Мне нужно сделать цикл, который суммирует следующие 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