特定の月の値を保持するテーブルがあります。
| | 製造 | 日付 | ファクター | ------------------------------ | | 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
のは、 の最後の値を s に入力するクエリです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]
結果
| | 日付 | ファクター | エクスファクター | ---------------------------------- | | 2013-01-01 | 1 | 1 | | | 2013-02-01 | (ヌル) | 1 | | | 2013-03-01 | (ヌル) | 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 | (ヌル) | 1 | | | 2013-09-01 | (ヌル) | 1 | | | 2013-10-01 | (ヌル) | 1 | | | 2013-11-01 | (ヌル) | 1 | | | 2013-12-01 | (ヌル) | 1 |