Proc Sql: промежуточный итог - PullRequest
0 голосов
/ 01 марта 2019

У меня есть данные ниже, и я создаю промежуточный итог -

data test;
input id$ year qtr sales;
cards;
a 2015 1 100
a 2015 2 2200
a 2015 3 100
a 2015 4 100
b 2015 1 10
b 2015 2 10


;run;

proc sql;
select a.id,a.year,a.qtr,a.sales,sum(a.sales) as running_tot
from test a,test b where a.id=b.id and a.year=b.year and a.qtr >= b.qtr
group by 1,2,3,4;
quit;

Но результат не верный, но если я сделаю продажи 100 вместо 2200, результат будет правильным?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Псевдоним A действует как поставщик защитного значения, которое ограничивает количество B строк, присоединяемых к нему.Таким образом, если вы SUM(A.SALES), вы, по сути, умножаете продажи строки защиты на количество подходящих ей строк B на A.qtr >= B.qtr

. group by 1,2,3,4 действительно может быть group by 1,2,3.Вы понимаете, почему?

Столбец 4 th , A.sales в сочетании с критериями where приводит к тому, что A.sales всегда будет одинаковым для группы 1,2,3 и, следовательно, не нужно.

Изучите несгруппированные результаты для лучшего понимания:

proc sql;
  create table work.result_ungrouped as
  select 
    a.id,
    a.year,
    a.qtr as a_qtr,
    a.sales as a_sales,
    b.qtr as b_qtr,
    b.sales as b_sales
from 
    test a, 
    test b
where 
    a.id = b.id and 
    a.year = b.year and
    a.qtr >= b.qtr    
;
quit;

Таким образом, правильные результаты доставляются SUM(B.sales), потому что они подчинены (или подробно)значения в группе, которая будет агрегироваться.

0 голосов
/ 01 марта 2019

Вы суммируете неправильную копию переменной SALES.

select a.id,a.year,a.qtr,a.sales
     , sum(b.sales) as running_tot
  from test a 
  left join test b on a.id=b.id and a.year=b.year and a.qtr >= b.qtr
  group by 1,2,3,4
;

Конечно, просто использовать шаг данных.

data want ;
  set test;
  by id year qtr;
  if first.year then running_tot=0;
  running_tot + sales;
run;
...