#sql #snowflake-cloud-data-platform
Вопрос:
SQL: Проверьте, оплачена ли дата до 19 числа месяца, следующего за периодом возврата
Требование состоит в том, чтобы определить своевременную оплату » Y » / «N»
• If monthly = PAID before the 19th of the month following the return period Example: Jan-Jan payment deadline = Feb 19 • If quarterly = paid before the 16th of the 2nd month following the return period Example: Jan-Mar payment deadline = May 16 • If last quarterly = paid before the 30th of the month following the return period Example: Oct-Dec payment deadline = Jan 30
Ежеквартально, если это последний квартал, то его оплата производится 30 -го числа следующего месяца, для остальной части месяца квартала это 16-е число месяца
with data as ( select 'Sep-Sep2021' AS PERIOD, '2021-10-11 22:09:45' AS DT, 'PAID' AS STATUS union all select 'Sep-Sep2021' AS PERIOD, '2021-10-20 22:09:45' AS DT, 'PAID' AS STATUS union all select 'Jan-Mar2021'AS PERIOD, '2021-04-11 22:09:45'AS DT, 'PAID' union all select 'Jan-Mar2021'AS PERIOD, '2021-05-20 22:09:45'AS DT, 'PAID' union all select 'Jan-Jan2021'AS PERIOD, '2021-02-11 22:09:44'AS DT, 'PAID'AS STATUS union all select 'Sep-Sep2021'AS PERIOD, '2021-10-12 04:10:00'AS DT, 'CANCELLED'AS STATUS union all select 'Jul-Sep2021'AS PERIOD, '2021-10-12 04:10:00'AS DT, 'PAID' STATUS union all select 'Oct-Dec2021'AS PERIOD, '2022-01-29 04:10:00'AS DT, 'PAID STATUS ) select * from data;
ожидаемый результат
Ответ №1:
Отредактировано с добавлением автора только последнего
select period, CASE WHEN REGEXP_COUNT(period,SUBSTR(period,1,3)) = 2 THEN 'monthly' WHEN REGEXP_COUNT(period,SUBSTR(period,1,3)) = 1 AND SUBSTR(period,1,3) = 'Oct' THEN 'quaterly_last' ELSE 'quaterly' END AS payment_type, CASE payment_type WHEN 'monthly' THEN DATEADD('month', 1, TO_DATE('19'||SUBSTR(period,5), 'DDMonYYYY')) WHEN 'quaterly' THEN DATEADD('month', 2, TO_DATE('16'||SUBSTR(period,5), 'DDMonYYYY')) WHEN 'quaterly_last' THEN DATEADD('month', 1, TO_DATE('30'||SUBSTR(period,5), 'DDMonYYYY')) END AS payment_deadline, dt, status, CASE WHEN status != 'PAID' THEN NULL WHEN dt lt; payment_deadline THEN 'Y' WHEN dt gt;= payment_deadline THEN 'N' END AS on_time_payment FROM data