SQL Server对比两列值打标后按维度汇总求和方法
解决方案
你已完成的大小对比打标逻辑可以直接复用,核心要解决的是跨两列的同维度聚合问题,不需要复杂的逐行判断,用纵向拆分再聚合的方式就能实现:
- 现有CTE返回的结果中,每一行同时包含两组映射关系:
COL_LEFT的取值对应RESULT_LEFT标记、COL_RIGHT的取值对应RESULT_RIGHT标记,宽表结构无法直接对两列的取值做统一聚合 - 用
UNION ALL把两组映射拆成结构完全一致的纵向数据集,统一成「列值、对应标记」两列结构 - 对拆分后的数据集按列值分组,求和对应标记就能得到每个取值的总计数,可直接生成结果表
RESULT_TABLE
完整SQL代码
WITH Tbl AS ( SELECT a.*, CASE WHEN PRICE_LEFT > PRICE_RIGHT THEN 1 ELSE 0 END AS RESULT_LEFT, CASE WHEN PRICE_RIGHT > PRICE_LEFT THEN 1 ELSE 0 END AS RESULT_RIGHT FROM SUMS_BY_VALUE a ), UnifiedData AS ( -- 提取左列与对应标记 SELECT COL_LEFT AS COL_VALUE, RESULT_LEFT AS MARK FROM Tbl UNION ALL -- 提取右列与对应标记 SELECT COL_RIGHT AS COL_VALUE, RESULT_RIGHT AS MARK FROM Tbl ) -- 汇总结果写入RESULT_TABLE,不需要建表可删除INTO子句 SELECT COL_VALUE, SUM(MARK) AS TOTAL_MARK INTO RESULT_TABLE FROM UnifiedData GROUP BY COL_VALUE ORDER BY COL_VALUE;
说明
- 相等的价格判断逻辑保留了你原有写法:两边价格相等时两个标记都赋值为0,符合你最初的CASE规则
- 代码完全兼容SQL Server LocalDB语法,用提供的测试数据可直接运行得到和示例一致的结果
- 如果需要额外返回原始明细行,只需要在最后一步关联Tbl和聚合结果即可,不需要修改核心聚合逻辑
内容的提问来源于stack exchange,提问作者Totallama
相关产品推荐
相关产品推荐

