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