【问题标题】:SUM subquery with GROUP BY inside of it内含 GROUP BY 的 SUM 子查询
【发布时间】:2021-02-26 21:36:27
【问题描述】:

我有一个特殊的查询要运行。我需要将每个地区下不同地级市的人口值求和为一列,并将其返回给主查询。例如这个查询:

SELECT region_en 
     , population AS temppop 
  FROM prefectures 
 WHERE region_id = 12 
 GROUP 
    BY region_en

返回此表:

Karditsa 129541
Larissa 279305
Magnesia 206995
Sporades 13798
Trikala 138047

以上所有都属于同一个区域 id (12),我需要在同一个查询下获得所有这些人口的总和。我尝试应用上述方法,但它不起作用。我没有得到 767686 而是 95960750 的总和:

SELECT SUM(b.cases) as cases
     , COALESCE(SUM(o.poptemp), 0) as pop
  FROM prefectures AS b 
  LEFT 
  JOIN 
     ( SELECT region_en
            , population AS poptemp 
         FROM prefectures 
        WHERE region_id = 12 
        GROUP 
           BY region_en
     ) AS o 
    ON o.region_en = b.region_en
 WHERE b.region_id = '12' 

基本上我需要每个地区的病例总数,以及居住在该地区的所有人的总和。

【问题讨论】:

  • 第一个查询中的 group by 没有任何作用,因为没有发生聚合 - 它可能会产生不正确的结果..
  • 这是必需的,因为对于包含每日病例的每一行来说,人口是一个固定值。没有它,我不会得到所有的个别县和他们的人口,而是一条或一条溪流……看看这个:prntscr.com/vjhzas
  • 你不应该在县的每一行中存储人口。
  • 它也可以是一个 Total_Cases 或 Total_Incubated 数字,这将是每个县的总数,每天都在增加......这是同一回事。

标签: mysql sql group-by sum subquery


【解决方案1】:

其实我用了不同的方法。

Select SUM(o.cas) as cases, SUM(o.pop) as population FROM
(SELECT a.population as pop, SUM(a.cases) as cas FROM prefectures a WHERE a.region_id = 12 GROUP BY a.region_en) AS o

这会恢复正确的值,而且速度也非常快。 最后你得到 2 列:

cases population
2515  767686

这是正确的值。

【讨论】:

    【解决方案2】:

    您似乎在寻找窗口总和。您的原始查询不是有效的聚合查询,这使事情有点不清楚。

    如果每个region_en只有一行,则不需要聚合:

    SELECT region_en, population, SUM(population) OVER() as region_population
    FROM prefectures 
    WHERE region_id = 12 
    

    您可以像这样一次为所有区域获得相同的结果:

    SELECT region_en, population, 
        SUM(population) OVER(PARTITION BY region_id) AS region_population
    FROM prefectures 
    

    如果每个region_en 确实有几行:

    SELECT region_en, SUM(population) AS population, 
        SUM(SUM(population)) OVER(PARTITION BY region_id) as region_population
    FROM prefectures 
    GROUP BY region_id, region_en
    

    请注意,窗口函数仅在 MySQL 8.0 中可用。在早期版本中,您可以将查询表述为:

    SELECT region_en, population, 
        (SELECT SUM(p1.population) FROM prefectures p1 WHERE p1.region_id = p.region_id) AS region_population
    FROM prefectures p
    

    【讨论】:

    • 我正要说...这是一个 MySQL 5 服务器,所以我不能使用窗口函数。让我看看我能用你发布的最后一个查询做什么。谢谢
    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多