Данные выглядят следующим образом:
YEAR MONTH ID1 ID2 FIELD FIELD_DESC
2017 4 123 2222 FFF red1
2017 4 123 2222 FFG red2
2017 4 224 2221 XYZ green1
2017 4 225 1234 TYU blue5
и желаемый результат
YEAR MONTH ID1 ID2 blue5 green1 red1 red2
2017 4 123 2222 0 0 1 1
2017 4 224 2221 0 1 0 0
2017 4 225 1234 1 0 0 0
На сервере SQL я запускал следующее:
select year, month, id1, id2, [field1], [field2] .... [fieldn]
from (select year, month, id1, id2, field, field_desc from source_table) P
Pivot (count(field) for field_desc in ([field1], [field2] .... [fieldn])) Pvt
Вышеприведенное дало бы мне количество полей каждого возможного описания по годам, месяцам, id1, id2.
Я пытаюсь перевести это на SAS.
Одним из подходов были бы условные суммы
proc sql;
create table aggr_table as
select year, month, id1, id2,
sum(case when field_desc = 'field1' then 1 else 0 end) as field1
...
sum(case when field_desc = 'fieldn' then 1 else 0 end) as fiendn
from source_table
group by year, month, id1, id2;
quit;
Второй способ, которым я пытался это сделать, заключался в
proc sort data = source_table
by year descending month descending id1 descending id2;
run;
data table_aggr (keep year month id1 id2 field1 .... fieldn);
set source_table
retain field1
....
fieldn 0);
if field_desc = 'field1' then do;
field1 = field1 +1;
end;
....
if field_desc = 'fieldn' then do;
fieldn = fieldn + 1;
end;
if last.id2 then
output;
by year month id1 id2;
run;
Но второй способ не работает
ОШИБКА: переменные BY неправильно отсортированы в наборе данных WORK.SOURCE_TABLE
Мои вопросы: 1) Мой поиск в Google до сих пор, кажется, указывает на предпочтение выполнения такого рода манипуляций с данными на этапе данных, а не на шаге proc sql, есть ли особое преимущество?
2) Что я сделал не так на шаге данных?
3) Есть ли лучший способ воспроизвести код SQL в верхней части сообщения? Оба варианта SAS, на которые я смотрю, выглядят довольно громоздкими по сравнению с оригиналом SQL.
Спасибо, Бен.