我有一张这样的桌子。
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
答案取决于数据库方言。
前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运行查询。