2012-04-12 3 views
2

Ich habe 3 Felder: ID, Datum, Rate. Für jede ID gibt es mehr Termine und Preise aus einer Tabelle kommen werde ichID mit mehreren Einträgen muss zu einem Eintrag pro ID geändert werden

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 
.... 

Ich brauche eine Lösung ‚Geschichte‘ nennen, die ID hat, seit 2011, seit 2010, seit 2009 mit den entsprechenden Sätzen (oder null/leer, wenn für dieses Jahr kein Tarifeintrag vorhanden ist), füllen Sie die Datumsfelder.

Ich habe Schwierigkeiten, einen Drehpunkt zu bekommen, um damit zu arbeiten, und versuche jetzt, Fallanweisungen zu verwenden.

Dies ist, was ich bisher:

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 

Problem, das ich ist immer bin jetzt jede andere Preise seine eigene Linie hat. ex:

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

Haben Sie etwas noch versucht? –

+0

Was Sie suchen, ist der PIVOT-Befehl: http://msdn.microsoft.com/en-us/library/ms177410.aspx – diaho

+0

@specialed hast du meine PIVOT Antwort gesehen? – Taryn

Antwort

0

Ein einfacher Weg, dies solange man nur diese 3 Jahre reicht wollen, ist zu tun:

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' 

Ansonsten Kasse verschwenken.

0

können Sie PIVOT auf diese Weise verwenden:

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 
Verwandte Themen