将 GROUP BY 与 SELECT CASE WHEN 语句一起使用

Use GROUP BY with SELECT CASE WHEN statement

我有一个 table 喜欢:

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

从 2020-07-01 到 2020-12-31,由于 Covid,销售税从 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

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

我想你想用 CASE 作为 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(因此不需要 ELSE 0 并且 '2020-07-01' 是您系统上的有效日期。我会通常使用 DATE '2020-07-01' 作为日期常量。