我想根据另一个表格日期范围对表格进行分组。
我正在尝试执行以下查询,其中我加入了一个表 Actuals
,其中包含一个 StartDate
。
我想按具有 Amount
和 StartDate
并且 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)
答案 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