【发布时间】:2021-09-28 20:24:54
【问题描述】:
我正在使用 CASE 语句将数据分组到 Month 列中,如下所示:
SUM(CASE WHEN MONTH(date) = 1 THEN ROUND(value) END) as jan,
SUM(CASE WHEN MONTH(date) = 2 THEN ROUND(value) END) as feb,
SUM(CASE WHEN MONTH(date) = 3 THEN ROUND(value) END) as mar
是否可以不必定义不同的 CASE 分组?
我想在 WHERE 语句中定义数据范围,然后按月对我定义的范围进行报告分组。例如,我的报告可能从 20 年 7 月开始,而不是从 1 月开始。
这在 SQL 查询中是否可行?
谢谢
编辑 - 示例输出:
+-------+-------+------+-------+-------+
| | July | Aug | Sep | etc |
+-------+-------+------+-------+-------+
| value | 435 € | 24 € | 234 € | 453 € |
+-------+-------+------+-------+-------+
编辑 - 可能的解决方案/解决方法:
如果我这样做,它可以被认为是“半动态的”。我仍然需要定义月份“桶”,但它们可以由开始日期触发(月份({ d '2021-01-01'})部分也可以稍后替换为变量,所以这也是固定的在代码中。
SUM (CASE WHEN MONTH(date) = month({ d '2021-01-01' }) THEN value END) as month_1,
SUM (CASE WHEN MONTH(date) = month({ d '2021-01-01' })+1 THEN value END) as month_2,
SUM (CASE WHEN MONTH(date) = month({ d '2021-01-01' })+2 THEN value END) as month_3,
etc
主要的缺点是我必须硬编码月份分组的数量。所以我很高兴听到更好的解决方案!
【问题讨论】:
-
请求不同的列数意味着您需要动态 SQL。检查您的 DBMS 文档中的功能。
-
请edit您的问题(通过点击下面的edit链接)并添加一些示例数据和基于该数据的预期输出为formatted text .请参阅here,了解有关如何创建漂亮的文本表格的一些提示。 (edit 您的问题 - 请不要将代码或其他信息放入 cmets)
-
您使用的是哪种 DBMS 产品? “SQL”只是所有关系数据库都使用的一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tag。 Why should I tag my DBMS
-
嗨,对不起 - 我已经更新了 ADS 标签和示例输出
标签: sql group-by case advantage-database-server