【发布时间】:2022-01-05 22:28:22
【问题描述】:
我正在使用两个不同的 covid 数据集,其中包括来自所有国家/地区的报告数据。我遇到的问题是 sum 和 group 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 表中的一行。