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

按供应商名称统计营业额的高效SQL实现方案问询

高效统计供应商营业额方案

针对需求,这里提供两种高效实现方式,均不会重复计算同一行中相同供应商的营业额:

方法一:带条件的UNION ALL(简洁直观)

核心思路:当一行的两个供应商名称相同时,仅统计一次营业额;不同时,分别给两个供应商各计入该笔营业额。

SELECT
    LOWER(supplier_name) AS supplier_name, -- 统一转为小写匹配目标结果格式
    SUM(turnover) AS total_turnover
FROM (
    -- 处理两供应商相同的行,仅输出一次
    SELECT SUPPLIER_PROD AS supplier_name, TURNOVER
    FROM TURNOVER_TABLE
    WHERE SUPPLIER_PROD = SUPPLIER_AUS
    UNION ALL
    -- 处理两供应商不同的行,分别输出两个供应商
    SELECT SUPPLIER_PROD AS supplier_name, TURNOVER
    FROM TURNOVER_TABLE
    WHERE SUPPLIER_PROD != SUPPLIER_AUS
    UNION ALL
    SELECT SUPPLIER_AUS AS supplier_name, TURNOVER
    FROM TURNOVER_TABLE
    WHERE SUPPLIER_PROD != SUPPLIER_AUS
) AS supplier_turnovers
GROUP BY LOWER(supplier_name);

执行结果:

supplier_nametotal_turnover
bosch12
magna2

方法二:交叉连接+条件聚合(大表场景性能更优)

如果表数据量较大,这种方法避免生成过多中间行,性能更高效。先提取所有唯一供应商,再通过交叉连接逐行判断每个供应商是否应计入当前行的营业额:

SELECT
    LOWER(s.supplier_name) AS supplier_name,
    SUM(
        CASE
            -- 两供应商相同且匹配当前统计供应商,全额计入
            WHEN t.SUPPLIER_PROD = t.SUPPLIER_AUS AND s.supplier_name = t.SUPPLIER_PROD THEN t.TURNOVER
            -- 当前供应商匹配任意一列,计入营业额
            WHEN s.supplier_name = t.SUPPLIER_PROD OR s.supplier_name = t.SUPPLIER_AUS THEN t.TURNOVER
            ELSE 0
        END
    ) AS total_turnover
FROM (
    -- 获取所有唯一供应商
    SELECT DISTINCT SUPPLIER_PROD AS supplier_name FROM TURNOVER_TABLE
    UNION
    SELECT DISTINCT SUPPLIER_AUS AS supplier_name FROM TURNOVER_TABLE
) AS s
CROSS JOIN TURNOVER_TABLE AS t
GROUP BY LOWER(s.supplier_name);

该方法同样能得到目标结果,且在大表场景下,因减少了中间结果集的行数,执行效率更高。

内容的提问来源于stack exchange,提问作者Pato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:49:55