SQL中的多个Group by

问题描述 投票:0回答:1

我有一张这样的桌子。

Year        Month       TenDays     Pay    
========================================
2015         8          2           12     
2016         8          1           43
2016         8          2           11
2016         9          1           22
2016         9          2           33
2016         9          3           4
2016         9          3           25

我希望SQL查询按'年','月'和'天数'计算'付费'总和为'TotalTenDays'组,并计算'Pay'为'TotalMonth'组的总和'年'和'月' ”。

我可以用“all all”来做到这一点,但我正在寻找一种不使用union和'with cte as()'的方法。可能吗?

预期表必须如下:

Year        Month       TenDays    TotalTenDays   TotalMonth
====================================================================
2015         8          2          12             12
2016         8          1          43             54
2016         8          2          11             54
2016         9          1          22             84
2016         9          2          33             84
2016         9          3          29             84
sql group-by
1个回答
1
投票

答案取决于数据库方言。

前4列是标准的SQL GROUP BY逻辑,即带有GROUP BY Year, Month, TenDays结果列的SUM(Pay) AS TotalTenDays

TotalMonth列最好使用OVER子句的窗口函数完成,但这只有在SQL方言支持它时才会这样做。

例如。对于SQL Server,您可以这样做:

SELECT Year, Month, TenDays
     , SUM(Pay) AS TotalTenDays
     , SUM(SUM(Pay)) OVER (PARTITION BY Year, Month) AS TotalMonth
  FROM MyTable
 GROUP BY Year, Month, TenDays
 ORDER BY Year, Month, TenDays

请参阅SQL Fiddle以使用MS SQL Server 2014运行查询。


如果SQL方言不支持窗口函数,那么comment by Jonathan Leffler中的建议是一个很好的选择:

您需要创建两个执行聚合的子查询,然后加入这两个子查询的结果。每个子查询都有不同的GROUP BY子句。

SELECT a.Year, a.Month, a.TenDays, a.TotalTenDays, b.TotalMonth
  FROM ( SELECT Year, Month, TenDays
              , SUM(Pay) AS TotalTenDays
           FROM MyTable
          GROUP BY Year, Month, TenDays
       ) a
  JOIN ( SELECT Year, Month
              , SUM(Pay) AS TotalMonth
           FROM MyTable
          GROUP BY Year, Month
       ) b ON b.Year = a.Year
          AND b.Month = a.Month
 ORDER BY a.Year, a.Month, a.TenDays

请参阅SQL Fiddle以使用MySQL 5.6运行查询。

© www.soinside.com 2019 - 2024. All rights reserved.