Oracle数据库:同表多条件查询结果合并为多列的实现问题
解决Oracle中合并同表两个查询为同一行不同列的问题
嘿,我懂你现在的困扰啦!你想针对cons.GM表的两个不同条件统计数值,把结果放在同一行的不同列里,但用UNION之后结果却分成了两行(在DBVisualizer里就显示成了不同标签页),对吧?
先说说原SQL的问题
你用的UNION是用来合并两个查询的行结果的,它会把两个统计值分别放在不同的行里,自然就没法在同一行显示两列数据啦。
方案一:用子查询作为列(简单直观)
这种写法把每个统计查询当作一个单独的列,借助Oracle的DUAL虚表来返回一行结果:
SELECT (SELECT COUNT(DISTINCT CODE) FROM cons.GM WHERE POLICY='NR' AND PCT IS NULL) AS Comp_PCT, (SELECT COUNT(DISTINCT CODE) FROM cons.GM WHERE POLICY='NR' AND DTY IS NULL) AS Comp_DTY FROM DUAL;
执行这个语句后,你就能看到Comp_PCT和Comp_DTY两个列在同一行显示各自的统计值了。
方案二:用CASE表达式+聚合函数(更高效)
如果你的cons.GM表数据量很大,上面的方案会扫描两次表,效率偏低。这种方案只需要扫描一次表,通过条件判断来分别统计:
SELECT COUNT(DISTINCT CASE WHEN PCT IS NULL THEN CODE END) AS Comp_PCT, COUNT(DISTINCT CASE WHEN DTY IS NULL THEN CODE END) AS Comp_DTY FROM cons.GM WHERE POLICY='NR';
原理是先过滤出POLICY='NR'的所有行,然后对每一行判断:
- 如果
PCT为空,就保留CODE,否则返回NULL,最后统计这些非空CODE的不同值数量,得到Comp_PCT - 同理处理
DTY为空的情况,得到Comp_DTY
两种方案都能解决你的问题,小表用方案一就行,大表优先选方案二哦!
内容的提问来源于stack exchange,提问作者CDZ30
相关产品推荐
相关产品推荐

