sql-server - 如何按月()分组但转移?
问题描述
我想知道如何在一个月内使用 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 的总和)与下个月的“真”分组。
有没有人知道如何做到这一点?(也许我正在尝试的不是如何做到这一点的好方法)
解决方案
对于 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')
请参阅演示。
推荐阅读
- ruby-on-rails - 没有将 Sass::Importers::Filesystem 隐式转换为 String
- python - 现成的正则表达式模板库,用于检查最流行的数据格式
- swift - 在swift 5中将货币文本字段转换为双倍?
- reactjs - 使用多个调度测试一个动作(加载、错误和成功)
- cordova-plugins - 如果我有完整路径,如何使用 Filesystem.readFile
- sql - 我如何选择订单表?
- java - 消息驱动 bean,未根据轮询间隔获取新电子邮件
- c# - 使用“in”参数修饰符传递文字
- c# - EF6 无法识别的 Guid 格式。试图在集合中找到
- dockerfile - 无法使用 dockerfile 安装具有基本映像的 Ghostscript 9.50 作为 Ubuntu 16.04