2015-12-07 5 views
0

В следующем запросе я пытаюсь группировать по ID и вычисленное поле даты. Я хотел бы сделать это в одном пакете proc sql, он работает, если я делаю 2 отдельных вызова SQL, но по какой-то причине я не могу группировать свой расчетный столбец. Я даже попытался изменить группу на: «group by 1,2», и это не сработало. Я подтвердил, что оба поля даты - это даты SAS, а не поля даты/времени. Упускаю ли я что-то совершенно очевидное?Группировка по вычисленному полю не работает должным образом

proc sql; 
create table work.test as 
select distinct 
    t1.id, 
    (case when t1.date1>t2.date2 then t2.date2 else t1.date1 end) format mmddyys10.0 as new_date, 
    sum(t1.amt) format dollar8.2 as new_amt 
from 
    work.cr_2 t1 
    inner join work.cr_1 t2 on t1.id=t2.id 
group by 
    t1.id, 
    calculated new_date; 
quit; 

ответ

2

Я думаю, что documentation довольно ясно по этому вопросу:

РАССЧИТАН позволяет использовать результаты выражения в том же ЗЕЬЕСТА или в предложении WHERE. Он действителен только тогда, когда используется для , для столбцов, которые вычисляются в непосредственном запросе .

Это не сказано GROUP BY. Таким образом, использовать подзапрос или повторить логику - и удалить distinct, пока вы на него:

proc sql; 
    create table work.test as 
    select tid, new_date, 
      sum(t1.amt) format dollar8.2 as new_amt 
    from (select t1.*, 
       (case when t1.date1 > t2.date2 then t2.date2 else t1.date1 end) format mmddyys10.0 as new_date 
      from work.cr_2 t1 inner join 
       work.cr_1 t2 
       on t1.id = t2.id 
     ) tt 
    group by id, new_date; 
quit; 
0

Это работает для меня. Возможно, было что-то еще не так?

data cr_2 ; 
    input id date1 amt ; 
    informat date1 yymmdd10. amt $dollar32.; 
    format date1 yymmdd10. ; 
cards; 
1 2015-12-01 100 
;;;; 
data cr_1 ; 
    input id date2 amt ; 
    informat date2 yymmdd10. amt $dollar32.; 
    format date2 yymmdd10. ; 
cards; 
1 2015-12-01 100 
;;;; 

proc sql; 
create table work.test as 
select t1.id 
    , case when t1.date1>t2.date2 then t2.date2 else t1.date1 
     end format yymmdd10. as new_date 
    , sum(t1.amt) format dollar8.2 as new_amt 
from work.cr_2 t1 
inner join work.cr_1 t2 
on t1.id=t2.id 
group by t1.id 
     , calculated new_date 
; 
quit; 

proc print; run; 
Смежные вопросы