首页 > 解决方案 > 如何按月()分组但转移?

问题描述

我想知道如何在一个月内使用 GROUP BY,但从一个月的第 n 天到下个月的 (n-1) 天。例如,我想从 1 月 20 日到 2 月 19 日,从 2 月 20 日到 3 月 19 日进行 GROUP...

目前,我可以根据条件 GROUP BY Months and dates <20。有演示: https ://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=8b55b7df44350c4ad3c595d03e421b6e

但是现在我不知道如何将一个月的“假”(即该值是天数 > 20 的总和)与下个月的“真”分组。

有没有人知道如何做到这一点?(也许我正在尝试的不是如何做到这一点的好方法)

标签: sql-server

解决方案


对于 20 日之前的每个日期,您可以减去 1 个月并将其与上个月分组:

WITH cte AS (
  SELECT CASE 
           WHEN DAY(Date) >= 20 THEN Date 
           ELSE DATEADD(mm, -1, Date) 
         END Date,
         Value
  FROM tablename 
)
SELECT YEAR(Date) year, MONTH(Date) month, SUM(Value) val
FROM cte
GROUP BY YEAR(Date), MONTH(Date)
ORDER BY YEAR(Date), MONTH(Date)

或者您可以将 CASE 表达式更改为:

CASE 
  WHEN DAY(Date) < 20 THEN Date 
  ELSE DATEADD(mm, 1, Date) 
END

以便 19 日之后的所有日期与下个月分组。

或者:

SELECT FORMAT(DATEADD(dd, -20, Date), 'yyyy-MM') year_month, 
       SUM(Value) val
FROM tablename
GROUP BY FORMAT(DATEADD(dd, -20, Date), 'yyyy-MM')

请参阅演示


推荐阅读