跨行的 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 求和的主要内容,如果未能解决你的问题,请参考以下文章