来自其他表的分组日期范围
Posted
技术标签:
【中文标题】来自其他表的分组日期范围【英文标题】:Group Date Range from other table 【发布时间】:2021-05-25 00:25:54 【问题描述】:我想根据另一个表格的日期范围对表格进行分组。
我正在尝试执行以下查询,其中我加入了一个表 Actuals
,该表有一个 StartDate
。
我想将其Amount
s 按具有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)
【问题讨论】:
【参考方案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
【讨论】:
以上是关于来自其他表的分组日期范围的主要内容,如果未能解决你的问题,请参考以下文章