SQL:Проверьте, оплачена ли дата вовремя, прежде чем следовать за периодом возврата

#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  

введите описание изображения здесь