首页 > 解决方案 > SQL:如何获取每个月的总付款及其每月总计

问题描述

我需要获取每个相应数据的月份。例如,我们将从日期 2020-01-08(YYYY-MM-DD) 获取月份。似乎 SELECT EXTRACT(MONTH FROM "2020-01-08") 仅从指定的日期获取,但我想要的很好,一次从行中获取所有月份。

我将在大多数情况下使用 ROLLUP 子条款,但对于那些不知道那是什么的人:

SELECT COALESCE(Brand, 'GrandTotal') AS Brand, SUM(Price) as 'TotalAmount'
FROM Purchase_Items
GROUP BY ROLLUP (Brand)

顺便说一句,COALESCE 将 NULL 重命名为 GrandTotal 并且 SUM 将所有数据添加到 Price 行中。所以它会像这样(给出的样本数据):

Brand              TotalAmount
-------------------------------
Apple              410000
Huawei             180000
Samsuing           261000
Xiaomi             110000
GrandTotal         961000

我的下一个结果必须看起来更像这样:

Month              Brand              TotalAmount
--------------------------------------------------
1                  Samsung            141000
1                  Monthly Total      141000
2                  Apple              170000
2                  Monthly Total      170000
3                  Huawei             135000
3                  Xiaomi             10000
3                  Monthly Total      145000
4                  Apple              70000
4                  Xiaomi             70000
4                  Monthly Total      140000
5                  Apple              170000
5                  Huawei             45000
5                  Samsung            120000
5                  Xiaomi             30000
5                  Monthly Total      365000
NULL               Grand Total        961000

它所做的是获取所有产品的价格,将它们加在一起,并根据它们从购买日期起的月份进行排序。听起来很简单,我不知道如何在 Google 或其他常见问题解答上搜索这个想法,所以我别无选择,只能在这里问这样的问题。我希望它不像看起来那样具有误导性或不清楚。

另外,我只建议只使用ROLLUP,所以CUBEPIVOT不是选项......

标签: sqlsql-serverrollup

解决方案


你似乎想要:

SELECT MONTH(<datecol>),
       (CASE WHEN MONTH(<datecol>) IS NULL AND Brand IS NULL
             THEN COALESCE(Brand, 'Grand Total')
             WHEN Brand IS NULL THEN 'Month Total'
             ELSE Brand
        END) AS Brand,
       SUM(Price) as TotalAmount
FROM Purchase_Items
GROUP BY ROLLUP (MONTH(<datecol>), Brand)

推荐阅读