Идентификатор с несколькими записями необходимо изменить на одну запись для каждого идентификатора

У меня есть 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
....

Мне нужно решение с идентификатором, датой 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

person specialed    schedule 12.04.2012    source источник
comment
Вам нужна команда PIVOT: msdn.microsoft.com/en- нас/библиотека/ms177410.aspx   -  person sazh    schedule 12.04.2012
comment
@specialed, ты видел мой ОСНОВНОЙ ответ?   -  person Taryn    schedule 16.04.2012


Ответы (2)


Простой способ сделать это, если вам нужны только эти трехлетние диапазоны:

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.

person GavinCattell    schedule 12.04.2012

Вы можете использовать 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
person Taryn    schedule 16.04.2012