问题:我有一个为期三年的12个月的时限,以36个财政期间的形式表示。我发现在每个月的最后一天,只提及每个月是最容易的(EOMONTH)。
我有两张桌子要比较。但我的问题是,有一张桌子需要翻译,我看不出该怎么做。
perfect.
<<<< 这是我的
从业务角度来看,这些数据表示项目工作。
有了这两张表,我可以很容易地比较句点,并了解正在发生的事情。
这是时间框架的主干,只是为了兴趣
declare @StartDate date = '2021-07-01';
declare @EndDate date = '2024-06-30';
WITH cte AS (
SELECT @StartDate AS myDate
UNION ALL
SELECT DATEADD(MONTH,1,myDate) as myDate
FROM cte
WHERE DATEADD(MONTH,1,myDate) <= @EndDate
)
SELECT EOMONTH(myDate)
FROM cte
OPTION (MAXRECURSION 0)然后我的数据就像这样
表1-按ProjectID分列的美元,财政期间
ProjectID FinPeriod PlannedSpend
AB309 2021-07-31 24087.51
AB302 2021-07-31 2877.5
AB315 2021-07-31 360
AB326 2021-07-31 0
AB331 2021-07-31 720
AB335 2021-07-31 -69325.02
AB454 2021-07-31 18876.8
AB449 2021-07-31 225
AB455 2021-07-31 -24972.1
AB430 2021-07-31 450
AB448 2021-07-31 9825.5表2-按财政期间分列的活动
ProjectID PhaseName FinPeriodStart FinPeriodFinish
AB315 Closure 2022-06-30 2024-06-30
AB315 Implementation 2022-10-31 2023-07-31
AB315 Investigation 2021-08-31 2022-04-30
AB335 Closure 2020-10-31 2021-09-30
AB335 Design 2020-09-30 2021-03-31
AB448 Closure 2022-03-31 2023-03-31
AB448 Design 2020-02-29 2020-05-31
AB448 Design 2022-04-30 2023-02-28
AB448 Implementation 2022-02-28 2022-05-31目标是:生产这个。
ProjectID FinPeriod Activities
AB315 2022-10-31 Implementation, Closure
AB448 2022-03-31 Closure
AB335 2020-09-30 Design, Clos
AB335 2021-09-30 Closure
AB326 2021-07-31 Design, Implementation, Closure,
AB331 2021-07-31 xxxxx我的尝试:
首先,我有一个财政期表,表示3年或36个月或36个财政期间。有趣,但对解决问题并没有真正直接的帮助,直到将布局可视化为止。
其次,我可以使用EOMONTH()函数导出一个阶段开始日期的财政期间和一个阶段结束日期。因此,对ID x项目而言,调查阶段于2021-12-13开始,即2021-12-31财政期,于2022-06-29财政期结束,即2022-06-30财政期。
但我如何“回填”或“翻译”的事实,如果活动X开始于今年1月,结束于12月,那么它一定是发生在所有的12个月之间?我想我问题的关键是我看不出如何改变
AB335 Design 2020-09-30 2021-03-31转到
AB335 2020-09-30 Design
AB335 2020-10-31 Design
AB335 2020-11-30 Design
...
AB335 2021-03-31 Design发布于 2022-03-05 22:52:06
看起来你的解决方案给出了你的CTE,给出了你所需的月份列表。
您可以通过使用apply来使用它来生成您想要的列表,例如:
declare @StartDate date = '20200101', @EndDate date = '20211231';
with cte as (
select @StartDate as myDate
union all
select DateAdd(month,1,myDate) as myDate
from cte
where DateAdd(month,1,myDate) <= @EndDate
), dates as (
select EOMonth(myDate) mydate
from cte
), activities as (
select 'AB335' ProjectId, 'Design' Phasename, Convert(date,'20200930') FinPeriodStart, Convert(date,'20210331') FinPeriodEnd
)
select ProjectId, mydate, Phasename
from activities a
outer apply(
select mydate from dates
where mydate >= FinPeriodStart and mydate <= FinPeriodEnd
)md;只需在适当的范围内使用CTE来满足需求,并在临时表或永久表中创建日期列表。
https://stackoverflow.com/questions/71366364
复制相似问题