如何在SAS Proc SQL中按CASEID仅显示一次聚合总和并保留Transaction ID
需求实现方案:每个CASEID仅显示一次聚合总和
可以实现这个需求,核心思路是通过窗口函数为每个CASEID分组内的行排序,仅保留分组第一行的聚合总和,其余行置空。以下是不同SQL方言的具体实现方式:
支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server等)
利用ROW_NUMBER()窗口函数标记每个CASEID分组内的行顺序,仅在第一行显示总和:
SELECT CASEID, Transaction_id, charge, -- 仅在分组第一行显示总和,其余行为NULL CASE WHEN ROW_NUMBER() OVER (PARTITION BY CASEID ORDER BY Transaction_id) = 1 THEN SUM(CAST(REPLACE(charge, '$', '') AS DECIMAL(10,2))) OVER (PARTITION BY CASEID) ELSE NULL END AS sumofcharges FROM your_table;
如果需要保留$符号格式化输出,可以修改总和部分:
SELECT CASEID, Transaction_id, charge, CASE WHEN ROW_NUMBER() OVER (PARTITION BY CASEID ORDER BY Transaction_id) = 1 THEN CONCAT('$', SUM(CAST(REPLACE(charge, '$', '') AS DECIMAL(10,2))) OVER (PARTITION BY CASEID)) ELSE NULL END AS sumofcharges FROM your_table;
不支持窗口函数的老版本MySQL
通过子查询预计算每个CASEID的总和,再关联原表并判断是否为分组首行(这里以最小Transaction_id作为首行标记):
SELECT t1.CASEID, t1.Transaction_id, t1.charge, CASE WHEN t1.Transaction_id = (SELECT MIN(Transaction_id) FROM your_table t2 WHERE t2.CASEID = t1.CASEID) THEN t3.sumofcharges ELSE NULL END AS sumofcharges FROM your_table t1 JOIN ( -- 预计算每个CASEID的总和并格式化 SELECT CASEID, CONCAT('$', SUM(CAST(REPLACE(charge, '$', '') AS DECIMAL(10,2)))) AS sumofcharges FROM your_table GROUP BY CASEID ) t3 ON t1.CASEID = t3.CASEID;
说明
- 排序字段
ORDER BY Transaction_id可根据业务需求调整(比如按charge排序),只要保证每个CASEID分组内有唯一的首行标记即可。 - 由于原数据中
charge是带$的字符串,需要先通过REPLACE和CAST转换为数值类型再计算总和,避免字符串求和错误。
内容的提问来源于stack exchange,提问作者TheJenk
相关产品推荐
相关产品推荐

