具有多个条目的ID需要更改为每个ID一个条目

时间:2012-04-12 18:35:35

标签: sql sql-server-2008 tsql pivot case

我有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

2 个答案:

答案 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