You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:38:15