Может быть лучше использовать процедуру отчетности, такую как PRINT
или REPORT
, для получения желаемого результата.
data have;
length group $20;
do group = 'A', 'B', 'C';
array month_totals jan2020 jan2019 feb2020 feb2019 mar2019 apr2019 may2019 jun2019 jul2019 aug2019 sep2019 oct2019 oct2019 nov2019 dec2019;
do over month_totals;
month_totals = 10 + floor(rand('uniform', 60));
end;
output;
end;
run;
ods excel file='data_with_total_row.xlsx';
proc print noobs data=have;
var group ;
sum jan2020--dec2019;
run;
proc report data=have;
columns group jan2020--dec2019;
define group / width=20;
rbreak after / summarize;
compute after;
group = 'Total';
endcomp;
run;
ods excel close;
![enter image description here](https://i.stack.imgur.com/WH3qi.png)
Структура данных
Наборы данных, с которыми вы работаете, являются «сложными», потому что аспект данных на самом деле находится в метаданных, то есть в имени столбца. Еще более удачный подход в SAS - использовать категориальные данные со столбцами
group
(категориальная роль) month
(категориальная роль) total
(непрерывная роль)
Такие данные могут быть легко отфильтрованы с помощью предложения where
, а процедуры отчетности, такие как REPORT
и TABULATE
, могут использовать переменную month
в class
оператор.
Пример:
data have;
length group $20;
do group = 'A', 'B', 'C';
do _n_ = 0 by 1 until (month >= '01feb2020'd);
month = intnx('month', '01jan2018'd, _n_);
total = 10 + floor(rand('uniform', 60));
output;
end;
end;
format month monyy5.;
run;
proc tabulate data=have;
class group month;
var total;
table
group all='Total'
,
month='' * total='' * sum=''*f=comma9.
;
where intck('month', month, '01feb2020'd) between 0 and 13;
run;
proc report data=have;
column group (month,total);
define group / group;
define month / '' across order=data ;
define total / '' ;
where intck('month', month, '01feb2020'd) between 0 and 13;
run;