복붙노트

[SQL] SQL은 전체 테이블을 바꾸어

SQL

SQL은 전체 테이블을 바꾸어

나는 MS SQL에서 다음 전치을 할 필요가

에서:

Day  A  B 
---------
Mon  1  2
Tue  3  4
Wed  5  6
Thu  7  8
Fri  9  0

다음 :

Value Mon Tue Wed Thu Fri 
--------------------------
A      1   3   5   7   9
B      2   4   6   8   0

나는 단지 하나의 열 (A)이있는 경우 PIVOT와 함께 할 것이 아니라 내가 전치에 여러 열이있을 때 그것을 어떻게 알아낼 수있는 방법 이해 (A, B, ...)

예제 코드는 전치한다 :

select LEFT(datename(dw,datetime),3) as DateWeek, 
  sum(ACalls) as A, 
  Sum(BCalls) as B 
from DataTable
group by LEFT(datename(dw,datetime),3)

테이블 구조 :

Column DataType
DateTime Datetime
ACalls int
BCalls int

어떤 도움이 많이 이해할 수있을 것이다.

해결법

  1. ==============================

    1.당신이 원하는 그 결과에 데이터를 바꾸어하기 위해, 당신은 UNPIVOT과 PIVOT 기능을 모두 사용해야합니다.

    당신이 원하는 그 결과에 데이터를 바꾸어하기 위해, 당신은 UNPIVOT과 PIVOT 기능을 모두 사용해야합니다.

    UNPIVOT 함수 행으로 A와 B 열과 변환 결과 걸린다. 그럼 당신은 열에 하루 값을 변환하기 위해 PIVOT 기능을 사용합니다 :

    select *
    from
    (
      select day, col, value
      from yourtable
      unpivot
      (
        value
        for col in (A, B)
      ) unpiv
    ) src
    pivot
    (
      max(value)
      for day in (Mon, Tue, Wed, Thu, Fri)
    ) piv
    

    데모와 SQL 바이올린을 참조하십시오.

    당신은 SQL 서버 2008+를 사용하는 경우, 당신은 CROSS 데이터를 피벗 해제하는 값을 적용 할 수 있습니다. 당신은 코드는 다음과 같이 변경 될 것이다 :

    select *
    from
    (
      select day, col, value
      from yourtable
      cross apply
      (
        values ('A', A),('B', B)
      ) c (col, value)
    ) src
    pivot
    (
      max(value)
      for day in (Mon, Tue, Wed, Thu, Fri)
    ) piv
    

    데모와 SQL 바이올린을 참조하십시오.

    편집 # 1이 유사한 것을 사용합니다 위의 솔루션으로 현재 쿼리를 적용 :

    select *
    from
    (
      select LEFT(datename(dw,datetime),3) as DateWeek,
        col, 
        value
      from DataTable 
      cross apply 
      (
        values ('A', ACalls), ('B', BCalls)
      ) c (col, value)
    ) src
    pivot
    (
      sum(value)
      for dateweek in (Mon, Tue, Wed, Thu, Fri)
    ) piv
    
  2. from https://stackoverflow.com/questions/15297809/sql-transpose-full-table by cc-by-sa and MIT license