SQL Server GROUP BY CUBE的SAS等效实现方法咨询
SAS中实现类似SQL Server GROUP BY CUBE的高效方法
当然有!你不需要多次调用PROC SUMMARY,SAS的PROC SUMMARY本身就支持直接生成类似CUBE的汇总结果,一次处理就能完成所有维度组合的统计,效率比多次追加高很多。
对应你SQL代码的SAS实现示例
假设你的数据已经导入到SAS数据集work.my_data中(如果还没导入,可以用PROC SQL或者LIBNAME连接数据库直接读取),可以这样写:
/* 生成所有CUBE组合的汇总统计 */ proc summary data=work.my_data completetypes; class load_date product_code / cube; var cust_no; /* 输出统计量:n对应count(*),ndistinct对应count(distinct) */ output out=summary_results(where=(_type_ ne 0)) n=volume ndistinct=Dist_Volume; run; /* 处理结果:替换缺失值为'Total',格式化日期 */ data final_results; set summary_results; /* 定义变量长度,可根据实际数据调整 */ length Char_dates $8 Product_codes $50; /* 处理日期维度:缺失则显示Total,否则转为YYYYMMDD格式字符串 */ if missing(load_date) then Char_dates = 'Total'; else Char_dates = put(load_date, yymmddn8.); /* 处理产品编码维度:缺失则显示Total */ if missing(product_code) then Product_codes = 'Total'; else Product_codes = product_code; /* 保留需要的字段 */ keep Char_dates Product_codes volume Dist_Volume; run;
关键说明
class语句后的/ cube选项:告诉SAS生成所有维度的组合汇总(包括单个维度、多个维度交叉、以及整体汇总),完全对应SQL的GROUP BY CUBE(load_date, Product_code)completetypes:确保生成所有可能的维度组合,避免因为某些维度没有数据而遗漏汇总行output语句里的n=volume直接对应SQL的count(*),ndistinct=Dist_Volume对应count(distinct cust_no)- 后续数据步的处理和你的SQL逻辑一致:把维度的缺失值替换为'Total',日期格式转为8位的YYYYMMDD字符串
另一种写法:用TYPE=CUBE参数
你也可以把type=cube直接写在PROC SUMMARY的选项里,效果和上面完全一样:
proc summary data=work.my_data completetypes type=cube; class load_date product_code; var cust_no; output out=summary_results(where=(_type_ ne 0)) n=volume ndistinct=Dist_Volume; run;
这种方式只需要读取一次数据集,比多次追加PROC SUMMARY效率高很多,尤其是数据量较大的时候。
内容的提问来源于stack exchange,提问作者Lizelle Van Der Walt
相关产品推荐
相关产品推荐

