我有3个字段: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
我一直在努力寻找一个支点来解决这个问题,现在我正试图使用案例陈述。
这是我到目前为止所做的:
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
答案 0 :(得分: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。
答案 1 :(得分: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