【发布时间】:2021-05-25 00:25:54
【问题描述】:
我想根据另一个表格的日期范围对表格进行分组。
我正在尝试执行以下查询,其中我加入了一个表 Actuals,该表有一个 StartDate。
我想将其Amounts 按具有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)
【问题讨论】:
标签: sql sql-server date tsql group-by