来自其他表的组日期范围

时间:2021-02-22 18:12:07

标签: sql sql-server date tsql group-by

我想根据另一个表格日期范围对表格进行分组。

我正在尝试执行以下查询,其中我加入了一个表 Actuals,其中包含一个 StartDate

我想按具有 AmountStartDate 并且 EndDate 位于 Actual.StartDate 开始和结束日期之间的财政月对其 FiscalMonthsCalendarOptions 进行分组.我不能做困难的月份(这将是一个轻松的 GROUP BY DATEPART(month, act.StartDate), act.LinkingId 组),这就是让这变得困难的原因。

我尝试了以下操作,但显然您可以对表别名进行分组。我相信正确的方法是使用 partition by 并且可能使用 lag 运算符,但我无法让它工作。

SELECT 
    act.LinkingId,
    SUM(act.Amount) as AmountTotal,
    CASE 
        WHEN act.StartDate BETWEEN fco.StartDate AND fco.EndDate 
           THEN fco.StartDate
           ELSE act.StartDate
    END AS FiscalStartDate
FROM 
    [Actuals] act
INNER JOIN 
    FiscalMonthsCalendarOptions fco ON 1 = 1 
WHERE 
    act.Amount <> 0
GROUP BY 
    FiscalStartDate, act.LinkingId

我用示例数据和预期结果制作了一个快速示例表

DECLARE @actuals TABLE (LinkingId int, StartDate datetime, Amount decimal(18,4))
INSERT INTO @actuals(LinkingId, StartDate, Amount)
VALUES (1, '2021-01-01', 5),
(1, '2021-01-15', 3),
(2, '2021-01-01', 5),
(2, '2021-01-30', 4),
(2, '2021-02-05', 2)

DECLARE @fiscalMonthsCalendarOptions TABLE (StartDate datetime, EndDate datetime, Code varchar(20))
INSERT INTO @fiscalMonthsCalendarOptions (StartDate, EndDate, Code)
VALUES ('2020-12-30', '2021-1-29', 'January'),
('2021-1-30', '2021-2-28', 'Feburary')

-- RESULT DESIRED: (LinkingId, Amount, StartDate)
-- (1, 8, 2020-12-30)
-- (2, 5, 2020-12-30)
-- (2, 6, 2021-1-30)

1 个答案:

答案 0 :(得分:1)

一种解决方案是在 act.StartDate 上加入日历表,这样您就不必乱用 partition by

SELECT 
    act.LinkingId,
    SUM(act.Amount) as AmountTotal,
    fco.StartDate
FROM @actuals act
INNER JOIN @fiscalMonthsCalendarOptions fco on act.StartDate between fco.StartDate AND fco.EndDate
GROUP BY fco.StartDate, act.LinkingId
相关问题