T-SQL聚合统计需求:合并指定数据源的交易计数
问题:合并指定数据源ID的交易计数统计
我需要统计各数据提供商的交易数量,要求将数据源ID为x、y、z的交易计数合并为一行,其余数据源单独显示各自的交易计数。但当前执行的T-SQL语句返回的是每个数据源单独一行的结果。我尝试了以下语句,期望当数据源ID为x、y、z时将计数合并到x对应的行,否则显示自身计数:
SELECT CASE WHEN C.Datasourceid IN (x, y, z) THEN x ELSE C.Datasourceid END AS DatasoureID, CASE WHEN D.DatasourceName IN ('Mips', 'Yips', 'Zips') THEN 'Mips' ELSE D.DatasourceName END AS DatasourceName, COUNT(*) AS Transactions FROM ClaimView C, DatasourceView D AND C.ReportDate BETWEEN '07/01/2023' AND '6/30/2024' DatasourceActiveIndicator = 'Y' GROUP BY C.Datasourceid, DatasourceName ORDER BY COUNT(*) DESC
当前未合并的结果
每个数据源ID(包括x、y、z)各自单独一行展示交易计数,例如:
- x:100笔
- y:200笔
- z:150笔
- 其他数据源(如A、B)分别显示对应计数
期望的合并后结果
将x、y、z的交易计数合并为一行,以x作为数据源ID,名称显示为'Mips',计数为三者之和;其余数据源保持单独显示:
- x(Mips):450笔(100+200+150)
- A:300笔
- B:250笔
修正后的T-SQL语句
SELECT CASE WHEN C.Datasourceid IN (x, y, z) THEN x ELSE C.Datasourceid END AS DatasourceID, CASE WHEN D.DatasourceName IN ('Mips', 'Yips', 'Zips') THEN 'Mips' ELSE D.DatasourceName END AS DatasourceName, COUNT(*) AS Transactions FROM ClaimView C INNER JOIN DatasourceView D ON C.Datasourceid = D.Datasourceid WHERE C.ReportDate BETWEEN '2023-07-01' AND '2024-06-30' AND D.DatasourceActiveIndicator = 'Y' GROUP BY CASE WHEN C.Datasourceid IN (x, y, z) THEN x ELSE C.Datasourceid END, CASE WHEN D.DatasourceName IN ('Mips', 'Yips', 'Zips') THEN 'Mips' ELSE D.DatasourceName END ORDER BY Transactions DESC
核心修正说明
- 表连接规范:把逗号连接改为
INNER JOIN并补充连接条件C.Datasourceid = D.Datasourceid,避免产生笛卡尔积导致统计错误 - 分组匹配:
GROUP BY必须和SELECT中的CASE表达式完全一致,不能按原始的数据源ID和名称分组,否则x、y、z仍会被单独统计 - 条件优化:补充
WHERE关键字,给字段添加表前缀避免歧义;使用ISO标准日期格式YYYY-MM-DD,提升SQL兼容性 - 排序简化:直接用
Transactions别名排序,代码更清晰易读
内容的提问来源于stack exchange,提问作者Zoomer
相关产品推荐
相关产品推荐

