You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:45:07