2012-04-12 3 views
2

ID、日付、レートの3つのフィールドがあります。各IDについて、私はID、日付2011、日付2010、対応する速度との日2009(またはnullを持つソリューションが必要「歴史」複数のエントリを持つIDをIDごとに1つのエントリに変更する必要があります

ID Date  Rate 
1 12/12/11 1.2 
1 08/10/10 1.8 
2 01/01/09 0.2 
2 03/12/08 0.5 
3 06/01/12 1.1 
3 07/20/10 0.9 
.... 

と呼ぶことにしますテーブルから複数の日付と料金があります/その年にレートエントリが存在しない場合は空白)、日付フィールドに値を入力します。

ID Date2011 Date2010 Date2009 
1  1.2  1.8  null 
2  null  null  0.2 
3  null  0.9  null 

私はピボットをこれで動作させるのに苦労し、現在ケースステートメントを使用しようとしています。

これは私がこれまで持っているものです:私は今取得しています

SELECT id, date, rate, 
CASE WHEN date <= '12/31/11' AND date >= '1/1/11' THEN rate END AS '2011', 
CASE WHEN date <= '12/31/10' AND date >= '1/1/10' THEN rate END AS '2010', 
CASE WHEN date <= '12/31/09' AND date >= '1/1/09' THEN rate END AS '2009' 
FROM history 
ORDER BY id 

問題は、それぞれ異なるレートでは、それ自身のラインを持っています。例:限り、あなたはこれらのみ3年間の範囲を必要としてこれを行うには

ID Date2011 Date2010 Date2009 
1  1.2  null  null 
1  null  1.8  null 
2  null  null  0.2 
3  null  0.9  null 
+1

あなたはまだ何を試してみましたか? –

+0

あなたが探しているのはPIVOTコマンドです:http://msdn.microsoft.com/en-us/library/ms177410.aspx – diaho

+0

@specialed私のPIVOTの回答を見ましたか? – Taryn

答えて

0

簡単な方法は次のとおりです。

SELECT f.id, f2011.rate, f2010.rate, f2009.rate 
FROM (SELECT id FROM fields GROUP BY id) f 
LEFT JOIN fields f2011 ON f.id = f2011.id AND f2011.date >= '01.01.2011' AND f2011.date < '31.12.2011' 
LEFT JOIN fields f2010 ON f.id = f2010.id AND f2010.date >= '01.01.2010' AND f2010.date < '31.12.2010' 
LEFT JOIN fields f2009 ON f.id = f2009.id AND f2009.date >= '01.01.2009' AND f2009.date < '31.12.2009' 

そうでない場合は、チェックアウトPIVOT。

0

あなたはPIVOTをこのように使用することができます。

create table #temp 
(
    id int, 
    date datetime, 
    rate decimal(10,2) 
) 

insert into #temp values(1, '12/12/11', 1.2) 
insert into #temp values(1, '08/10/10', 1.8) 
insert into #temp values(2, '01/01/09', 0.2) 
insert into #temp values(2, '03/12/08', 0.5) 
insert into #temp values(3, '06/01/12', 1.1) 
insert into #temp values(3, '07/20/10', 0.9) 

select * 
from 
(
    select id, rate, year(date) as yearDate 
    from #temp 
) x 
pivot 
(
    max(rate) 
    for yearDate in([2011], [2010], [2009], [2008]) 
) p 

drop table #temp 
関連する問題