如何合并两个SELECT查询以统计运营商各类型套餐总数量
SQL多套餐类型合并统计方案
错误原因
你原有合并查询的统计结果偏大,是因为直接对Plan和InternetPlan两张套餐表做了JOIN操作,产生了笛卡尔积:同一运营商的每条普通套餐记录,都会和该运营商的所有流量套餐记录一一匹配,最终生成的行数是两类套餐数量的乘积,因此COUNT统计出来的数值远高于实际求和的结果。
正确写法
方案1:子查询分别统计后求和
这种写法逻辑直观,兼容性好,也可以灵活处理某类套餐为空的场景:
SELECT a.OperatorName, ISNULL((SELECT COUNT(b.planName) FROM dbo.Plan b WHERE b.OperatorID = a.OperatorID), 0) + ISNULL((SELECT COUNT(c.intplanName) FROM dbo.InternetPlan c WHERE c.OperatorID = a.OperatorID), 0) AS Plans FROM dbo.Operator a GROUP BY a.OperatorName, a.OperatorID
方案2:UNION ALL合并记录后统一统计
如果后续还要扩展更多套餐类型,这种写法更易维护:
SELECT OperatorName, COUNT(*) AS Plans FROM ( -- 提取所有普通套餐关联的运营商 SELECT a.OperatorName FROM dbo.Operator a INNER JOIN dbo.Plan b ON a.OperatorID = b.OperatorID UNION ALL -- 提取所有流量套餐关联的运营商 SELECT a.OperatorName FROM dbo.Operator a INNER JOIN dbo.InternetPlan c ON a.OperatorID = c.OperatorID ) AS AllPlanRecords GROUP BY OperatorName
两种写法都可以得到你需要的运营商套餐总数统计结果。
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

