Как сгруппировать по результату за одну и ту же дату

#sql #sas

Вопрос:

У меня есть два запроса, где первый собирает информацию, второй должен подвести итоги. Однако код показывает мне повторяющиеся результаты. Например, на 2021-10 годы у меня есть несколько записей, я хотел бы, чтобы за каждый месяц была одна запись.

 PROC SQL;  create table PolisyEnd as   select distinct   (t4.spr_NRB) as NRB  ,datepart(t1.PRP_END_DATE) as POLICY_VINTAGE format yymmd7.,  case  when datepart(t1.PRP_END_DATE) IS NOT NULL and datepart(t1.PRP_END_DATE) - amp;gv_date_dly. lt; 0 THEN 'W'   when datepart(t1.PRP_END_DATE) IS NOT NULL and datepart(t1.PRP_END_DATE) - amp;gv_date_dly. gt;= 0 and datepart(t1.PRP_END_DATE) - amp;gv_date_dly. lt;=7 THEN 'U'   when datepart(t1.PRP_END_DATE) IS NOT NULL and datepart(t1.PRP_END_DATE) - amp;gv_date_dly. gt;= 30 THEN 'A'   when datepart(t1.PRP_END_DATE) IS NULL THEN 'NO INFO'    end as POLISA_  from   cmz.WMDTZDP_BH t1 left join   (select distinct kontr_id,obj_oid from cmz.BH_D_ZAB_X_ALOK_amp;thismonth) t2  on t2.obj_oid = t1.obj_oid  left join   (select distinct data_danych, kontr_id, kre_nrb from dm.BH_WMDTKRE_amp;thismonth) t3 on t3.kontr_id = t2.kontr_id   left join   (select distinct spr_NRB, spr_STATUS from _mart.mart_kred) t4 on t4.spr_NRB = t3.kre_nrb    where datepart(t1.data_danych) between '5Aug2019'd and amp;gv_date_dly. and t1.Actual = "T" and t4.spr_STATUS ="A" group by   datepart(t1.data_danych)   ,datepart(t1.PRP_END_DATE)  ;  quit; PROC SQL;   create table PolisyEnd1 as  select distinct  POLICY_VINTAGE  ,count(NRB) as NUMBER  from PolisyEnd  where POLISA_INFORMACJA ="A"  group by POLICY_ ; Quit;  

Вот результат, который я получил. но это неправильно: введите описание изображения здесь

Комментарии:

1. Какова здесь цель? Что ты считаешь?

Ответ №1:

ГРУППИРОВАТЬ ПО не группирует по форматированным значениям. Некоторые процедуры делают это.

Попробуй

 group by   put(datepart(t1.data_danych), yymmd7.)  ,put(datepart(t1.PRP_END_DATE), yymmd7.)  

Комментарии:

1. Я добавил его в первую часть запроса, к сожалению, ничего не изменилось 🙁

Ответ №2:

Все решено. Следует изменить дату на строку

 ,put(datepart(t1.PRP_END_DATE),yymmd7.) as POLICY_VINTAGE,   

Комментарии:

1. Зачем преобразовывать в строку? Просто стандартизируйте до определенной даты в течение месяца. intnx('month',datepart(t1.PRP_END_DATE),0) as POLICY_VINTAGE format=yymmd7.

Ответ №3:

Как вы думаете, что создает первый запрос? Почему вы группируетесь по переменным, не включенным в выходные данные? Почему в вашем СЛУЧАЕ не учитываются даты, которые превышают 7 и менее чем через 30 дней после намеченной даты?

Может быть, вы хотели сделать что-то подобное?

 create table PolisyEnd as   select distinct   (t4.spr_NRB) as NRB  ,datepart(t1.data_danych) as DATA_DANYCH_DATE format yymmdd10.  ,intnx('month',datepart(t1.PRP_END_DATE),0) as POLICY_VINTAGE format yymmd7.  ,case  when t1.PRP_END_DATE IS NULL THEN 'NO INFO'   when datepart(t1.PRP_END_DATE) lt; amp;gv_date_dly. THEN 'W'   when datepart(t1.PRP_END_DATE) lt;= amp;gv_date_dly.   7 THEN 'U'   when datepart(t1.PRP_END_DATE) gt;= amp;gv_date_dly.   30 THEN 'A'   else ' ' /* Between 7 and 30 days */  end as POLISA_ from cmz.WMDTZDP_BH t1 left join (select distinct kontr_id,obj_oid from cmz.BH_D_ZAB_X_ALOK_amp;thismonth) t2   on t2.obj_oid = t1.obj_oid left join (select distinct data_danych, kontr_id, kre_nrb from dm.BH_WMDTKRE_amp;thismonth) t3  on t3.kontr_id = t2.kontr_id left join (select distinct spr_NRB, spr_STATUS from _mart.mart_kred) t4  on t4.spr_NRB = t3.kre_nrb  where datepart(t1.data_danych) between '5Aug2019'd and amp;gv_date_dly.  and t1.Actual = "T"  and t4.spr_STATUS ="A" ;