2

ID、日付、レートの 3 つのフィールドがあります。IDごとに、「履歴」と呼ぶテーブルからの複数の日付と料金があります

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、日付 2011、日付 2010、日付 2009 に対応するレート (またはその年のレート エントリが存在しない場合は null/空白) が日付フィールドに入力されるソリューションが必要です。

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

私が今得ている問題は、それぞれの異なるレートに独自の行があることです。元:

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

2 に答える 2

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
于 2012-04-16T14:32:56.040 に答える
0

これらの 3 つの年の範囲のみが必要な場合に限り、これを行う簡単な方法は次のとおりです。

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 をチェックしてください。

于 2012-04-12T18:55:04.427 に答える