跨行的 SQL 求和

Posted

技术标签:

【中文标题】跨行的 SQL 求和【英文标题】:SQL sum across rows 【发布时间】:2021-01-05 12:35:42 【问题描述】:

我正在尝试进行查询以获得此结果(Presto sql,以防相关)

| State  | Region   | City     | Sales-City | Sales-Region | Sales-State |
|--------|----------|----------|------------|--------------|-------------|
| Italy  | Lombardy | Milan    | 100        | 150          | 250         |
| Italy  | Lombardy | Como     | 50         | 150          | 250         |
| Italy  | Tuscany  | Florence | 75         | 100          | 250         |
| Italy  | Tuscany  | Prato    | 25         | 100          | 250         |
| France | Ile de F.| Paris    | 5          | 10           | 20          |
| ..     | ..       | ..       | ..         | ..           | ..          |

基础写完

SELECT State, Region, City,
       SUM(Sales) as "Sales-City"
FROM db
GROUP BY State, Region, City

但我当然被困在 Sales-Region / Sales-State 部分。在性能方面解决它的方法是什么?必须编写两个(可能更多)单独的 WITH 语句似乎很荒谬。

【问题讨论】:

【参考方案1】:

使用窗口函数!

select state, region, city,
       sum(sales) as sales_city,
       sum(sum(sales)) over(partiton by state, region) sales_region,
       sum(sum(sales)) over(partiton by state) sales_state
from db
group by state, region, city

【讨论】:

【参考方案2】:

解决此类问题的另一种方法是使用分组集或汇总与相关组合进行聚合 -

SELECT State, Region, City,
       SUM(Sales)
FROM db
GROUP BY GROUPING SETS (
(State),
(State,Region),
(State,Region,City));

或者

SELECT State, Region, City,
       SUM(Sales)
FROM db
GROUP BY ROLLUP (State, Region, City);

【讨论】:

以上是关于跨行的 SQL 求和的主要内容,如果未能解决你的问题,请参考以下文章

用于连接等价行的 SQL 查询对列求和

加入求和时限制 SQL 中返回的行的最佳方法

在当前行中,对代表上周(7 天)记录的行的数据求和

SQL Server - 将条件链接到原始行的 SUM 前面的行

如何对数据框中某些列和行的数据求和?

差距和岛屿 - 如何按 ID 对每组连续行求和