我们说我有以下数据:
我想要使用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是第二个标准季度,而2017年7月8日是第三个),而我需要它等于0(因为08/05 / 2017和08/07/2017属于同一季度,如果我们从08/05/2017开始)。而这就是我得到的:
答案 0 :(得分:1)
执行此操作的一种方法是使用递归cte生成自定义开始日期和结束日期。此后,left join
打开此表以获得所需的结果。
with quarter_dates(startdate,enddate) as
(select cast('2017-05-08' as date),cast(dateadd(day,-1,dateadd(month,3,'2017-05-08')) as date)
union all
select dateadd(month,3,startdate),dateadd(month,3,enddate)
from quarter_dates
where startdate <'2020-12-01' --change this value based on the last startdate required
)
select d.startdate,d.enddate,y.type,sum(y.montant)
from quarter_dates d
left join yourtable y on y.periode between d.startdate and d.enddate
group by d.startdate,d.enddate,y.type