Суммирование более одного раза набора данных с использованием proc sql

#sas

#sas

Вопрос:

Мои данные

 data mydata;
input 
Category $ 
Item 
type
amount;
datalines;
A  1 100 11111
A  2 900 11111
A  3 123 11111
B  1 113 11111
B  2 900 11111
C  1 111 11111
C  2 900 11111
;
 

Моя попытка

 proc sql;
create table want as 
    select *, sum(amount and item <> 900) as without900, sum(amount) as total from mydata       
group by category
;
quit;
 

Результат

 Category    Item    type    amount  without900  total  
  A          3       123     11111       3      33333
  A          1       100     11111       3      33333
  A          2       900     11111       3      33333
  B          2       900     11111       2      22222
  B          1       113     11111       2      11111
  C          2       900     11111       2      11111
  C          1       111     11111       2      11111
 

Ожидаемый результат

 Category    Item    type    amount  without900  total  
  A          3       123     11111    22222     33333
  A          1       100     11111    22222     33333
  A          2       900     11111    22222     33333
  B          2       900     11111    11111     22222
  B          1       113     11111    11111     11111
  C          2       900     11111    11111     11111
  C          1       111     11111    11111     11111
 

Я знаю, что этого можно легко достичь, создав другую таблицу и, возможно, следовательно, используя левое соединение. Интересно, как достичь ожидаемого, используя как можно меньший шаг proc SQL. Большое вам спасибо.

Ответ №1:

Вы сравниваете item с 900 , когда вы должны сравнивать type . Условная сумма может быть выполнена с помощью case предложения внутри.

Пример

 data mydata;
  input Category $ Item type amount;
datalines;
A  1 100 11111
A  2 900 11111
A  3 123 11111
B  1 113 11111
B  2 900 11111
C  1 111 11111
C  2 900 11111
;

proc sql;
  create table want as 
  select 
    *
    , sum(case when type ne 900 then amount end) as without900
    , sum(amount) as total
  from 
    mydata       
  group by 
    category
;
quit;