按供应商名称统计营业额的高效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_name | total_turnover |
|---|---|
| bosch | 12 |
| magna | 2 |
方法二:交叉连接+条件聚合(大表场景性能更优)
如果表数据量较大,这种方法避免生成过多中间行,性能更高效。先提取所有唯一供应商,再通过交叉连接逐行判断每个供应商是否应计入当前行的营业额:
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
相关产品推荐
相关产品推荐

