首页 > 解决方案 > 将 GROUP BY 与 SELECT CASE WHEN 语句一起使用

问题描述

我有一张像这样的桌子:

ORDER_DATE | ORDER_ID | ORDER_AMOUNT
2020-11-07 | 1        | 40
2020-11-07 | 1        | 60
2021-04-01 | 2        | 100

从 2020 年 7 月 1 日到 2020 年 12 月 31 日,由于新冠疫情,营业税从 19% 降低到 16%。

现在我需要知道每个 ORDER_ID 的总金额。结果应该是:

ORDER_ID | ORDER_AMOUNT
1        | 116
2        | 119

到目前为止我的代码:

SELECT CASE WHEN ORDER_DATE BETWEEN '2020-07-01' AND '2020-12-31'
                THEN SUM(ORDER_AMOUNT) * 1.16
            WHEN (ORDER_DATE < '2020-07-01' OR ORDER_DATE > '2020-12-31')
                THEN SUM(ORDER_AMOUNT) * 1.19 
            ELSE 0
       END AS 'gross_amount'
--
FROM my_dwh_table
--
GROUP BY
        CASE WHEN ORDER_DATE BETWEEN '2020-07-01' AND '2020-12-31'
                THEN SUM(ORDER_AMOUNT) * 1.16
            WHEN (ORDER_DATE < '2020-07-01' OR ORDER_DATE > '2020-12-31')
                THEN SUM(ORDER_AMOUNT) * 1.19 
            ELSE 0
        END
;

但我在 DBeaver 中收到此错误:

SQL Error [42000]: set function in group by clause

如何使用 CASE WHEN 语句通过 ORDER_ID 上的 GROUP BY 计算不同的销售税?我的代码中的错误在哪里?

标签: sqloracleexasol

解决方案


我想你想用 theCASE作为参数来表达这个SUM()

SELECT ORDER_ID,
       SUM(CASE WHEN ORDER_DATE BETWEEN '2020-07-01' AND '2020-12-31'
                THEN ORDER_AMOUNT * 1.16
                ELSE ORDER_AMOUNT * 1.19 
           END) AS gross_amount
FROM my_dwh_table
GROUP BY ORDER_ID;

不需要ORDER BY

注意:这假定ORDER_DATE永远不会NULL(因此不需要 anELSE 0并且这'2020-07-01'是您系统上的有效日期。我通常会使用DATE '2020-07-01'日期常量。


推荐阅读