#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" ;