【发布时间】:2017-05-18 13:02:03
【问题描述】:
假设我有以下数据:
我想使用 SQL 实现的目标是根据季度范围(以 3 个月为增量)对 Montant 列求和,这些季度从自定义初始日期(不一定是 1 月 1 日)开始。
示例:
假设,我选择 08/05/2017 作为我的初始日期,我的宿舍将是:
08/05/2017 - 07/08/2017
08/08/2017 - 07/11/2017
08/11/2017 - 07/02/2018
08/02/2018 - 07/05/2018
等等……
生成的表格将是这样的:
这是我目前取得的成就:
SELECT
[Type],
CONVERT(date, DATEADD(QUARTER, TAB4.PeriodOffset, '08/05/2017')) AS [Periode],
SUM([Montant]) AS [Montant]
FROM
(
SELECT
[Type],
DATEDIFF(QUARTER, '08/05/2017', [Date]) AS [PeriodOffset]
[Montant]
FROM
(
--Data
) TAB3
) TAB4
GROUP BY TAB4.PeriodOffset, TAB4.[Type]
这里的问题是,DATEDIFF(QUARTER, '08/05/2017', [Date]) 根据标准季度(从 1 月 1 日、4 月 1 日、7 月 1 日和 10 月 1 日开始)比较日期。这意味着DATEDIFF(QUARTER, '08/05/2017', '08/07/2017') 等于 1(因为 08/05/2017 在第二个标准季度,而 08/07/2017 在第三个季度)而我需要它等于 0(因为 08/05/2017如果我们从 08/05/2017 开始,则 08/07/2017 属于同一季度)。这就是我得到的:
【问题讨论】:
-
制作另一个表格来定义您的自定义期间(开始日期、结束日期、期间编号或类似内容)。然后将您的查询加入周期表。
-
开始日期并不总是相同的,数据可能有数千行。每次我想运行查询时,我都负担不起创建一个新表。
-
所以在你的情况下..是四分之一 90 天?还是只是 startdate+3months-1day?
-
@vkp 这是开始日期 + 3 个月 - 1 天。当然,3 个月不是 90 天,这取决于开始日期。
-
你确定你不能让你的查询甚至创建一个临时表来定义周期然后加入它吗?我认为这是一个可靠的选择。您需要“自定义开始日期”作为用户输入还是基于数据?
标签: sql sql-server