SQL Server 2014合并两表统计结果并添加总行求和问题
解决SQL Server 2014中联合查询的汇总行问题
你的问题出在最后一个UNION部分的LEFT OUTER JOIN逻辑上——这个关联操作并不是在统计两个表关联ALL_USERS后的总行数,而是把SIGMA_TEST和BETA_TEST按DOMID关联后的行数,这和你需要的“两个分组查询结果的COUNT总和”完全不是一回事。
修正后的查询(无需CTE)
这里我们用UNION ALL来保留两个分组查询的所有结果(如果你的业务需要去重,可以换回UNION),然后单独计算两个关联查询的行数总和作为TOTAL行:
-- 第一个分组统计:SIGMA_TEST关联ALL_USERS SELECT A.TEST_CODE, B.DIVISION, COUNT(*) AS [Count] FROM ALL_USERS B JOIN SIGMA_TEST A ON B.DOMID = A.DOMID GROUP BY A.TEST_CODE, B.DIVISION UNION ALL -- 第二个分组统计:BETA_TEST关联ALL_USERS SELECT E.TEST_CODE, F.DIVISION, COUNT(*) AS [Count] FROM ALL_USERS F JOIN BETA_TEST E ON E.DOMID = F.DOMID GROUP BY E.TEST_CODE, F.DIVISION UNION ALL -- 汇总行:计算两个关联查询的总行数之和 SELECT 'TOTAL', '', SUM([Count]) AS [Count] FROM ( -- 分别计算两个关联查询的行数 SELECT COUNT(*) AS [Count] FROM ALL_USERS B JOIN SIGMA_TEST A ON B.DOMID = A.DOMID UNION ALL SELECT COUNT(*) AS [Count] FROM ALL_USERS F JOIN BETA_TEST E ON E.DOMID = F.DOMID ) AS SubTotal
为什么你的原始汇总逻辑不对?
你用LEFT OUTER JOIN SIGMA_TEST A ON A.DOMID = E.DOMID得到的是:
- 保留
SIGMA_TEST的所有行,匹配到BETA_TEST的行会合并,没匹配到的BETA_TEST列显示NULL COUNT(*)会把这些包含NULL的行也统计进去,但这并不是你需要的“两个表分别关联ALL_USERS后的行数总和”,而是两个表按DOMID关联后的行数,自然会和预期的6不符。
额外简化方案
如果你只是需要分组统计+总行数汇总,也可以把计算总行数的部分直接写成子查询相加,省去内层的UNION ALL:
SELECT A.TEST_CODE, B.DIVISION, COUNT(*) AS [Count] FROM ALL_USERS B JOIN SIGMA_TEST A ON B.DOMID = A.DOMID GROUP BY A.TEST_CODE, B.DIVISION UNION ALL SELECT E.TEST_CODE, F.DIVISION, COUNT(*) AS [Count] FROM ALL_USERS F JOIN BETA_TEST E ON E.DOMID = F.DOMID GROUP BY E.TEST_CODE, F.DIVISION UNION ALL SELECT 'TOTAL', '', (SELECT COUNT(*) FROM ALL_USERS B JOIN SIGMA_TEST A ON B.DOMID = A.DOMID) + (SELECT COUNT(*) FROM ALL_USERS F JOIN BETA_TEST E ON E.DOMID = F.DOMID) AS [Count]
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

