在CASE语句外执行计数:为SQL查询新增P/C列去重统计列需求
实现SQL查询新增不同值统计列的方案
嘿,我来帮你搞定这个需求!你需要在现有SQL查询结果里新增两列,分别统计P列和C列中不同值的总数,并且让整列都显示这个计数值对吧?下面给你两种适配不同数据库环境的常用方案:
方案一:使用窗口函数(推荐,适合现代数据库)
如果你的数据库支持窗口函数(比如PostgreSQL、MySQL 8.0+、SQL Server、Oracle等),直接用COUNT(DISTINCT ...) OVER ()就能轻松实现,不需要额外关联表:
假设你的原查询是这样的:
SELECT 列1, 列2, P, C FROM 你的表名;
修改后的查询:
SELECT 列1, 列2, P, C, -- 统计P列的不同值总数,整列显示该数值 COUNT(DISTINCT P) OVER () AS distinct_p_count, -- 统计C列的不同值总数,整列显示该数值 COUNT(DISTINCT C) OVER () AS distinct_c_count FROM 你的表名;
原理说明
COUNT(DISTINCT P)会计算结果集中P列的唯一值数量OVER ()表示不做分区,将这个统计结果应用到每一行,所以整列都会显示同一个总数
方案二:使用子查询(兼容旧版本数据库)
如果你的数据库不支持窗口函数中的COUNT(DISTINCT)(比如MySQL 5.x),可以用交叉连接子查询的方式来获取统计值:
SELECT t.列1, t.列2, t.P, t.C, p_stats.distinct_p_count, c_stats.distinct_c_count FROM 你的表名 t -- 交叉连接获取P列的不同值总数 CROSS JOIN (SELECT COUNT(DISTINCT P) AS distinct_p_count FROM 你的表名) p_stats -- 交叉连接获取C列的不同值总数 CROSS JOIN (SELECT COUNT(DISTINCT C) AS distinct_c_count FROM 你的表名) c_stats;
原理说明
- 两个子查询分别计算
P和C列的唯一值数量 - 交叉连接(CROSS JOIN)会让原查询的每一行都关联到这两个统计值,从而实现整列显示同一个总数
注意:如果你的原查询有WHERE过滤条件,记得把过滤条件也同步到子查询里,这样统计的是过滤后结果集的不同值数量哦!
内容的提问来源于stack exchange,提问作者user7948585
相关产品推荐
相关产品推荐

