我有一个表格,其中包含特定月份的值:
| MFG | DATE | FACTOR | ----------------------------- | 1 | 2013-01-01 | 1 | | 2 | 2013-01-01 | 0.8 | | 2 | 2013-02-01 | 1 | | 2 | 2013-12-01 | 1.55 | | 3 | 2013-01-01 | 1 | | 3 | 2013-04-01 | 1.3 | | 3 | 2013-05-01 | 1.2 | | 3 | 2013-06-01 | 1.1 | | 3 | 2013-07-01 | 1 | | 4 | 2013-01-01 | 0.9 | | 4 | 2013-02-01 | 1 | | 4 | 2013-12-01 | 1.8 | | 5 | 2013-01-01 | 1.4 | | 5 | 2013-02-01 | 1 | | 5 | 2013-10-01 | 1.3 | | 5 | 2013-11-01 | 1.2 | | 5 | 2013-12-01 | 1.5 |
我想要做的是使用calendar
表(已定义)来转动这些表:
最后,级联NULL
列以使用之前的值。
我到目前为止所提供的是一个查询,它会使NULL
的最后一个值填充mfg = 3
。每个mfg
将始终具有一年中第一个的值。我的问题是;如何将其转移并扩展到所有mfg
?
SELECT c.[date],
f.[factor],
Isnull(f.[factor], (SELECT TOP 1 factor
FROM factors
WHERE [date] < c.[date]
AND [factor] IS NOT NULL
AND mfg = 3
ORDER BY [date] DESC)) AS xFactor
FROM (SELECT [date]
FROM calendar
WHERE Datepart(yy, [date]) = 2013
AND Datepart(d, [date]) = 1) c
LEFT JOIN (SELECT [date],
[factor]
FROM factors
WHERE mfg = 3) f
ON f.[date] = c.[date]
结果
| DATE | FACTOR | XFACTOR | --------------------------------- | 2013-01-01 | 1 | 1 | | 2013-02-01 | (null) | 1 | | 2013-03-01 | (null) | 1 | | 2013-04-01 | 1.3 | 1.3 | | 2013-05-01 | 1.2 | 1.2 | | 2013-06-01 | 1.1 | 1.1 | | 2013-07-01 | 1 | 1 | | 2013-08-01 | (null) | 1 | | 2013-09-01 | (null) | 1 | | 2013-10-01 | (null) | 1 | | 2013-11-01 | (null) | 1 | | 2013-12-01 | (null) | 1 |
答案 0 :(得分:6)
不知道您是否需要从日历表中获取动态日期,或者mfg
是否可以超过5,但这应该会给您一些想法。
select *
from (
select c.date,
t.mfg,
(
select top 1 f.factor
from factors as f
where f.date <= c.date and
f.mfg = t.mfg and
f.factor is not null
order by f.date desc
) as factor
from calendar as c
cross apply(values(1),(2),(3),(4),(5)) as t(mfg)
) as t
pivot (
max(t.factor) for t.date in ([20130101], [20130201], [20130301],
[20130401], [20130501], [20130601],
[20130701], [20130801], [20130901],
[20131001], [20131101], [20131201])
) as P