는 SQL 서버에서는이 결과를 얻을 수있는 몇 가지 방법이 있습니다. 당신이 값의 제한된 번호가있는 경우
, 당신은 쉽게 하드 코딩 결과를 할 수 있습니다. 당신은 결과를 얻을 수있는 한 가지 방법은 CASE 표현식으로 집계 함수를 사용하는 것입니다 :
select t.id, t.name,
col = c.col+cast(seq as varchar(4)),
c.val
from
(
select id, name, year, value,
row_number() over(partition by id order by year desc) seq
from yourtable
) t
cross apply
(
select 'year', t.year union all
select 'value', t.value
) c (col, val)
이 SQL Fiddle with Demo를 참조하십시오. 이것은 여러 행과 약간 다른 형식으로 여러 열을 변환합니다
| ID | NAME | COL | VAL |
| 2 | Ted | year1 | 2013 |
| 2 | Ted | value1 | 2000 |
| 2 | Ted | year2 | 2012 |
| 2 | Ted | value2 | 1000 |
는 그런 다음 최종 원하는 결과를 얻기 위해이에 PIVOT 기능을 적용 할 수
select id, name, year1, value1, year2, value2
from
(
select t.id, t.name,
col = c.col+cast(seq as varchar(4)),
c.val
from
(
select id, name, year, value,
row_number() over(partition by id order by year desc) seq
from yourtable
) t
cross apply
(
select 'year', t.year union all
select 'value', t.value
) c (col, val)
) d
pivot
(
max(val)
for col in (year1, value1, year2, value2)
) piv;
는 SQL Fiddle with Demo를 참조하십시오. 당신은 당신이 행을 열로에서 변환 할 값의 알 수없는 번호가 마지막으로 경우에, 당신은 저장 프로 시저 내부에 동적 SQL을 사용할 수 있습니다
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(col+cast(seq as varchar(4)))
from
(
select row_number() over(partition by id order by year desc) seq
from yourtable
) d
cross apply
(
select 'year', 1 union all
select 'value', 2
) c (col, so)
group by seq, col, so
order by seq, so
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, name,' + @cols + '
from
(
select t.id, t.name,
col = c.col+cast(seq as varchar(4)),
c.val
from
(
select id, name, year, value,
row_number() over(partition by id order by year desc) seq
from yourtable
) t
cross apply
(
select ''year'', t.year union all
select ''value'', t.value
) c (col, val)
) x
pivot
(
max(val)
for col in (' + @cols + ')
) p '
execute sp_executesql @query;
이 SQL Fiddle with Demo를 참조하십시오.
| ID | NAME | YEAR1 | VALUE1 | YEAR2 | VALUE2 |
| 2 | Ted | 2013 | 2000 | 2012 | 1000 |
도움이 될 수 있습니다 : [PIVOT 및 UNPIVOT 사용 (http://technet.microsoft.com/en-us/library/ms177410 (V = SQL.105)에서 .aspx 모든 버전은 결과를 줄 것이다) –
결과가 2 년으로 제한됩니까? – Taryn