2013-08-26 2 views
-2

나는이 같은 SQLServer에 테이블에 데이터가 :간단한 SQL 쿼리 -

ID Name Yr1 Value1 Yr2 Value2 
-- ---- --- ------ --- ------ 
2  Ted  2013 2000  2012 1000 

없음 커서 가능한 경우 :

ID Name Year Value 
-- ---- ---- ----- 
2 Ted 2013 2000 
2 Ted 2012 1000 

나는 출력이에보기 구문이 필요합니다. 모든 단서가 유용 할 것입니다.

+1

도움이 될 수 있습니다 : [PIVOT 및 UNPIVOT 사용 (http://technet.microsoft.com/en-us/library/ms177410 (V = SQL.105)에서 .aspx 모든 버전은 결과를 줄 것이다) –

+0

결과가 2 년으로 제한됩니까? – Taryn

답변

3

는 SQL 서버에서는이 결과를 얻을 수있는 몇 가지 방법이 있습니다. 당신이 값의 제한된 번호가있는 경우

, 당신은 쉽게 하드 코딩 결과를 할 수 있습니다. 당신은 결과를 얻을 수있는 한 가지 방법은 CASE 표현식으로 집계 함수를 사용하는 것입니다 :

select d.id, 
    d.name, 
    max(case when seq = 1 then year end) year1, 
    max(case when seq = 1 then value end) value1, 
    max(case when seq = 2 then year end) year2, 
    max(case when seq = 2 then value end) value2 
from 
(
    select id, name, year, value, 
    row_number() over(partition by id order by year desc) seq 
    from yourtable 
) d 
group by d.id, d.name; 

SQL Fiddle with Demo를 참조하십시오. 당신이 PIVOT 기능을 사용하려면, 그럼 내가 먼저 yearvalue 열 데이터를 unpivoting 첫 을 제안합니다. unpivot 프로세스는 여러 열을 여러 행으로 변환합니다. 당신은 UNPIVOT 기능을 사용할 수 있습니다,하지만 내 예제에서 나는 CROSS는 UNION 모든 쿼리를 적용 사용하고 코드는 다음과 같습니다

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

감사합니다. – kanderson