【问题标题】:SQL: How to get the total payment for each month and its monthly totalSQL:如何获取每个月的总付款及其每月总计
【发布时间】:2021-02-18 18:53:12
【问题描述】:

我需要获取每个对应数据的月份。例如,我们将从日期 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 不是选项...

【问题讨论】:

    标签: sql sql-server rollup


    【解决方案1】:

    你似乎想要:

    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)
    

    【讨论】:

    • 等等,那个 在那里......它有什么作用?编辑:啊,我只需要用列名替换 哈哈
    • 您应该使用 GROUPING() 函数,例如 stackoverflow.com/a/64547825/14267425 中的更新 - 请注意,它使用了相同的数据集和方法(但使用的是 CUBE 而不是 ROLLUP)。
    • 我可能会在 CUBE 部分使用这个 GROUPING() 函数,所以感谢@seanb 的提醒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2014-12-10
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    相关资源
    最近更新 更多