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

使用SELECT JOIN SUM编写SQL查询:统计各国销售总额问题

全量国家销售总额统计解决方案

核心逻辑

要覆盖所有出现的国家(包括无销售记录、无对应名称的),必须用全外连接关联两张表,再结合聚合函数计算总额,同时处理空值避免结果异常。

通用SQL代码(支持PostgreSQL、SQL Server等)

假设表结构:

  • COUNTRY:ID_Country(主键)、Country_Name(国家名称)
  • SALES_COUNTRY:ID_Country(关联键)、Sales_Amount(销售金额)
SELECT
    COALESCE(c.Country_Name, '无名称国家') AS 国家名称,
    COALESCE(SUM(sc.Sales_Amount), 0) AS 销售总额
FROM
    COUNTRY c
FULL OUTER JOIN
    SALES_COUNTRY sc ON c.ID_Country = sc.ID_Country
GROUP BY
    c.ID_Country, c.Country_Name
ORDER BY
    国家名称;

关键细节说明

  • FULL OUTER JOIN:同时保留COUNTRY里所有国家(哪怕没销售)和SALES_COUNTRY里所有存在的国家ID(哪怕COUNTRY没对应名称)。
  • COALESCE():把空值替换成友好显示——无名称的国家标为'无名称国家',无销售的总额显示为0,避免结果出现NULL。
  • GROUP BY:按国家唯一标识(ID+名称)分组,保证每个国家只输出一行统计结果。

MySQL兼容方案(MySQL不支持FULL OUTER JOIN)

用LEFT JOIN+RIGHT JOIN+UNION模拟全外连接:

SELECT
    COALESCE(c.Country_Name, '无名称国家') AS 国家名称,
    COALESCE(SUM(sc.Sales_Amount), 0) AS 销售总额
FROM
    COUNTRY c
LEFT JOIN
    SALES_COUNTRY sc ON c.ID_Country = sc.ID_Country
GROUP BY
    c.ID_Country, c.Country_Name

UNION

SELECT
    COALESCE(c.Country_Name, '无名称国家') AS 国家名称,
    COALESCE(SUM(sc.Sales_Amount), 0) AS 销售总额
FROM
    COUNTRY c
RIGHT JOIN
    SALES_COUNTRY sc ON c.ID_Country = sc.ID_Country
GROUP BY
    c.ID_Country, c.Country_Name
ORDER BY
    国家名称;

你之前代码的常见问题

如果用INNER JOIN,只会保留两边都有匹配的国家,漏掉无销售或无名称的;如果只用LEFT JOIN/RIGHT JOIN,只能保留其中一张表的全量数据,另一张表的孤立记录会被丢弃。只有全外连接能满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:32:38