【问题标题】:dynamic grouping by month in SQLSQL中按月动态分组
【发布时间】: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”只是所有关系数据库都使用的一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS
  • 嗨,对不起 - 我已经更新了 ADS 标签和示例输出

标签: sql group-by case advantage-database-server


【解决方案1】:

您可以创建动态 sql 语句将结果生成到临时表中,然后从临时表中返回结果。这是一个例子:

declare sqlStr string;
sqlStr = 'SELECT 1 AS column1, 2 AS column2 INTO #temp FROM system.iota';

execute immediate sqlStr;

select * from #temp;

生成所需分组的逻辑取决于您。您需要使用the while loop to construct the statement text.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2011-07-21
    • 2021-12-04
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多