sql - 将 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 计算不同的销售税?我的代码中的错误在哪里?
解决方案
我想你想用 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'
日期常量。
推荐阅读
- android - Android Studio 4.0 颜色预览
- html - 不使用百分比水平分布 3 列容器的内部 Div?- 柔性
- python - 图像序列未在 OpenCV 中维护
- gremlin - Gremlin:如何在单个查询中获取传出边及其目标顶点
- c - UDP 上的 wav 文件无法在带有 Alsa-lib 的 unix 中正确播放
- node.js - 尝试在 Mongodb 和 nodejs 中建立 $ 查找关系时出现错误
- go - 多数据库驱动场景:将接口作为类型传递
- python - 使用 selenium 获取页面的某个部分
- reporting-services - Power BI 报表服务器:扩展自定义安全:如何添加/注册管理员用户(无 AD)
- html - HTML 当单元格没有更多空间时,从新行开始