【问题标题】:sum dates values based on custom quarters基于自定义季度的日期值总和
【发布时间】: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


【解决方案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

【讨论】:

  • 作为一个完全没有 CTE 的文盲,这非常有帮助(尽管我仍在试图弄清楚它是如何工作的)。感谢并感谢 Jacob H 提出了相同的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
相关资源
最近更新 更多