Итак, у меня есть данные с именем table1 следующим образом:
Obs ID M_201812 M_201901 M_201902 M_201903
1 X1 1 . . .
2 X2 1 1 . .
3 X3 . 1 1 .
4 X4 . 1 . .
5 X5 . 1 . .
6 X6 1 . . .
7 X7 1 1 . .
8 X8 1 1 . .
9 X9 . . 1 .
10 X10 1 1 . .
Каждый столбец здесь - это месяц, который динамически генерируется на основе ранее запущенного макроса. Месяцы будут динамичными и будут разными. Что мне нужно сделать, это рассчитать суммы за последние 3 месяца, последние 6 месяцев и последние 12 месяцев. Подход, который я имел в виду, был следующим:
A) Сохраните имена столбцов в макропеременной:
proc sql noprint;
select distinct name
into :cols2 separated by ','
from dictionary.columns
where upcase(memname) = 'Table1' and name not in ('ID');
;
quit;
%put &cols2.
Вывод был следующим:
M_201812,M_201901,M_201902,M_201903
B) Затем создайте суммы на основе количества элементов в переменной:
data table1;
set table1;
if count("&cols2",",") <=3 then do;
3m_total=sum(of &cols2);
6m_total=sum(of &cols2);
12m_total=sum(of &cols2);
end;
else if 3< count("&cols2",",") <=6 then do;
3m_total=sum(%scan(%superQ(cols2),-1,%str(,)),%scan(%superQ(cols2),-2,%str(,)),%scan(%superQ(cols2),-3,%str(,)));
6m_total=sum(of &cols2);
12m_total=sum(of &cols2);
end;
else if 6< count("&cols2",",") <=12 then do;
3m_total=sum(%scan(%superQ(cols2),-1,%str(,)),%scan(%superQ(cols2),-2,%str(,)),%scan(%superQ(cols2),-3,%str(,)));
6m_total=sum(%scan(%superQ(cols2),-1,%str(,)),%scan(%superQ(cols2),-2,%str(,)),%scan(%superQ(cols2),-3,%str(,)),%scan(%superQ(cols2),-4,%str(,)),%scan(%superQ(cols2),-5,%str(,)),%scan(%superQ(cols2),-6,%str(,)));
12m_total=sum(of &cols2);
else do;
3m_total=sum(%scan(%superQ(cols2),-1,%str(,)),%scan(%superQ(cols2),-2,%str(,)),%scan(%superQ(cols2),-3,%str(,)));
6m_total=sum(%scan(%superQ(cols2),-1,%str(,)),%scan(%superQ(cols2),-2,%str(,)),%scan(%superQ(cols2),-3,%str(,)),%scan(%superQ(cols2),-4,%str(,)),%scan(%superQ(cols2),-5,%str(,)),%scan(%superQ(cols2),-6,%str(,)));
12m_total=sum(%scan(%superQ(cols2),-1,%str(,)),%scan(%superQ(cols2),-2,%str(,)),%scan(%superQ(cols2),-3,%str(,)),%scan(%superQ(cols2),-4,%str(,)),%scan(%superQ(cols2),-5,%str(,)),%scan(%superQ(cols2),-6,%str(,)),
%scan(%superQ(cols2),-7,%str(,)),%scan(%superQ(cols2),-8,%str(,)),%scan(%superQ(cols2),-9,%str(,)),%scan(%superQ(cols2),-10,%str(,)),%scan(%superQ(cols2),-11,%str(,)),%scan(%superQ(cols2),-12,%str(,)));
end;
run;
Обычно мы получаем 12-месячную сумму, только если доступно 12 месячных столбцов. Если доступно только 3 месяца, то сумма за 3 месяца = сумма за 6 месяцев = сумма за 12 месяцев. После запуска кода я получаю следующую ошибку:
ERROR 159-185: Null parameters for SUM are invalid.
Это происходит при последнем утверждении do. Я не могу понять, почему я не смогу прочитать простое утверждение «если тогда сделаешь». Есть ли ошибка в условиях if или при вызове макропеременной? Любая помощь здесь будет оценена. Большое спасибо.