【问题标题】:SUM and GROUP BY in SQL totaling issueSQL 总计问题中的 SUM 和 GROUP BY
【发布时间】:2022-01-05 22:28:22
【问题描述】:

我正在使用两个不同的 covid 数据集,其中包括来自所有国家/地区的报告数据。我遇到的问题是 sumgroup by 函数,其中 SQL 正在汇总所有分组的行,这不必要地增加了输出。在下面的示例中,总死亡人数应为 4,849,总病例数为 17,441

*注:数据集包括每个国家的城市/省,以下已按国家分组

CREATE TABLE covid.deaths(
    country varchar(255),
    deaths int
);


CREATE TABLE covid.confirmed_cases(
    country varchar(255),
    cases int
);
    *country*   *deaths*    *cases*
    China   0   747
    China   0   519
    China   0   1500
    China   0   264
    China   1   159
    China   3   1992
    China   2   1008
    China   4   1632
    China   7   1650
    China   6   190
    China   213 1260
    China   8   1197
    China   58  3260
    China   13  362
    China   22  703
    China   4512 998

但是,当我运行下面的查询时,我得到 279,056 个病例总数和 77,584 个死亡病例。在尝试自行解决此问题时,我删除了其中一个 sum 函数(但保留了日期),并发现通过输出,SQL 正在将所有行的总数填充到列中,然后在两个 @ 时将这些列相加存在 987654326@ 函数(本质上 SQL 使用的方程是 total deaths or cases x number of rows)。

SELECT
    COALESCE(d.country_region, "Unknown") AS country,
    SUM(d._11_16_21) as deaths,
    SUM(c._11_16_21) as cases
FROM `covid.deaths` as d
JOIN `covid.confirmed_cases` as c
    ON d.country_region = c.country_region
WHERE d.country_region = "China"
GROUP BY 
    d.country_region

删除了 sum 函数的输出

SELECT
    COALESCE(d.country_region, "Unknown") AS country,
    SUM(d._11_16_21) as deaths,
    c._11_16_21 as cases
FROM `covid.deaths` as d
JOIN `covid.confirmed_cases` as c
    ON d.country_region = c.country_region
WHERE d.country_region = "China"
GROUP BY 
    d.country_region, c._11_16_21  


    *country*   *deaths*    *cases*
    China   4849    747
    China   4849    519
    China   4849    1500
    China   4849    264
    China   4849    159
    China   4849    1992
    China   4849    1008
    China   4849    1632
    China   4849    1650
    China   4849    190
    China   4849    1260
    China   4849    1197
    China   4849    3260
    China   4849    362
    China   4849    703
    China   4849    998

有没有办法让 SQL 只显示唯一的总和作为输出?

*注意:正在使用 Coalesce,因为有些国家/地区名称是 null

【问题讨论】:

  • 请更新您的问题以显示表的创建语句
  • 您的查询引用了您的示例数据中没有的列 country_region、country 和 _11_16_21。请通过提供实际的源数据来澄清您的问题。根据结果​​,您的源表似乎每个国家/地区有不止一行。这个问题可以通过使用子查询分别预先聚合每个表来解决,或者在连接条件中添加更多字段,这样confirmed_cases 表中的每一行都只匹配deaths 表中的一行。

标签: sql group-by sum


【解决方案1】:

在将 covid 病例与死亡病例联系起来之前分别求和

SELECT
    COALESCE(d.country_region, c.country_region, 'Unknown') AS country,
    d.deaths,
    c.cases
FROM (
    SELECT country_region
    , SUM(`_11_16_21`) as deaths
    FROM `covid.deaths` 
    WHERE country_region = 'China'
    GROUP BY country_region
) as d
JOIN (
    SELECT country_region
    , SUM(`_11_16_21`) as cases
    FROM  `covid.confirmed_cases`
    WHERE country_region = 'China'
    GROUP BY country_region
) as c
  ON c.country_region = d.country_region

【讨论】:

  • 请注意,我将 FULL JOIN 更改为正常的 INNER JOIN。因为我猜这是针对 MySql 或 MariaDB 的。因此,您的数据库很可能不支持 FULL JOIN。
  • 只要所有 country_regions 都报告了病例和死亡,内连接就可以工作。如果任一集合中缺少行,则结果将被低估。
  • 好的,但请注意,大多数 RDBMS 中都存在类似 FULL OUTER JOIN 的内容。但是另一种方法很丑(左连接和右连接查询之间的联合)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2012-09-18
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多