2012-04-12 60 views
2

我有3个字段:ID,日期,比率。对于每个ID有多个日期和价格从表中来,我会打电话的“历史”带有多个条目的ID需要更改为每个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与相应的费率(或空的解决方案/如果当年不存在费率条目,则为空)填充日期字段。

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

我一直在努力获得一个支点与此工作,现在我试图使用case语句。

这是我到目前为止有:

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 
+1

你尝试过什么了吗? – 2012-04-12 18:38:52

+0

你在找什么是PIVOT命令:http://msdn.microsoft.com/en-us/library/ms177410.aspx – diaho 2012-04-12 18:53:01

+0

@specialed你看到我的PIVOT答案了吗? – Taryn 2012-04-16 16:00:11

回答

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