请求实现两张不同表符合条件的统计计数结果并排展示的SQL方案
把两个表的统计结果合并成并排列的解决方案
嘿,我懂你要的效果——就是把两个表各自的统计计数放在同一行展示,对应相同的level2分组对吧?我给你整理了一个能实现这个需求的SQL写法,还考虑了可能存在的分组在其中一个表没数据的情况:
最终可用的SQL代码
SELECT -- 取非空的level2id和名称,避免某一边无数据时显示NULL COALESCE(t1.level2id, t2.level2id) AS level2id, COALESCE(t1.level2name, t2.level2name) AS level2name, -- 把空计数转成0,看起来更直观 ISNULL(t1.Count_OrgHierarchy, 0) AS Count_OrgHierarchy, ISNULL(t2.Count_LBETL4969, 0) AS Count_LBETL4969 FROM -- 第一个表的统计子查询,给计数列起个专属别名 ( SELECT level2id, level2name, COUNT(*) AS Count_OrgHierarchy FROM OrgHierarchy (NOLOCK) WHERE Level2name LIKE 'A%' AND contractname = 'MSSP' AND Patient_Status IN ( 'Active (WithClaims)', 'Deceased/Active (WithClaims)', 'Active (NoClaims)', 'Deceased/Active (NoClaims)' ) GROUP BY level2id, level2name ) t1 -- 用FULL JOIN确保所有分组都被展示,不管在哪个表存在 FULL JOIN -- 第二个表的统计子查询,同样给计数列起别名 ( SELECT level2id, level2name, COUNT(*) AS Count_LBETL4969 FROM OrgHierarchy_LBETL4969 (NOLOCK) WHERE Level2name LIKE 'A%' AND contractname = 'MSSP' AND Patient_Status IN ( 'Active (WithClaims)', 'Deceased/Active (WithClaims)', 'Active (NoClaims)', 'Deceased/Active (NoClaims)' ) GROUP BY level2id, level2name ) t2 -- 通过level2id和name关联两个子查询的结果 ON t1.level2id = t2.level2id AND t1.level2name = t2.level2name -- 这里按两个计数的总和降序排,你也可以改成单独按某一列排序 ORDER BY ISNULL(t1.Count_OrgHierarchy, 0) + ISNULL(t2.Count_LBETL4969, 0) DESC;
几点小说明
- 我保留了你原来用的
NOLOCK提示,但要提醒一句:这个提示会允许脏读,要是对数据精度要求极高的场景,得谨慎使用哦。 - 如果你的
level2id本身就是唯一标识分组的(不需要依赖level2name),可以把JOIN条件简化成ON t1.level2id = t2.level2id,这样查询会更高效。 - 要是你只想看两个表都存在的分组,把
FULL JOIN改成INNER JOIN就行。
内容的提问来源于stack exchange,提问作者Andrew Day
相关产品推荐
相关产品推荐

