根据自定义区域

时间:2017-05-18 13:02:04

标签: sql sql-server

我们说我有以下数据:

Data to sum

我想要使用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

     

依旧......

结果表格如下:

Result table

这是我到目前为止取得的成就:

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开始)。而这就是我得到的:

enter image description here

1 个答案:

答案 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