복붙노트

[SQL] SQL : 실시간 트랜스

SQL

SQL : 실시간 트랜스

나는 피벗 및 UNPIVOT에 대해 알고. 그게 내가 원하는 것이 아니다. 피벗 및 UNPIVOT 집계 데이터,하지만 내가 원하는 것이 아니다.

매트릭스 (선형 대수)과 같은 테이블을 생각해. 내가 m의 X N 행렬로 시작하는 경우에, 나는 n x m 행렬에 그 매트릭스 (테이블) 변환 할. 나는 진정한 TRANSPOSE를 원한다.

어떻게 SQL에서이 작업을 수행 할 수 있습니다?

예를 들어 내가있는 경우 :

1  2  3
1  2  4
6  7  8
3  2  1
3  9  1

결과는해야한다 :

1  1  6  3  3
2  2  7  2  9
3  4  8  1  1

행의 수는 열 수, 그 반대가됩니다 것을 알 수 있습니다. 내가 그룹화 또는 데이터의 집계되지 않았 음을 또한은 예고. 소스의 모든 단일 값이 존재하는 결과에 존재하고, 그 X-Y 좌표는 교체되었다.

해결법

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

    1.당신은 당신이 UNPIVOT과 PIVOT으로이 작업을 수행 할 수 없다고 생각하는 이유는 확실하지 오전 :

    당신은 당신이 UNPIVOT과 PIVOT으로이 작업을 수행 할 수 없다고 생각하는 이유는 확실하지 오전 :

    select [1], [2], [3], [4], [5]
    from 
    (
      select *
      from
      (
        select col1, col2, col3,
          row_number() over(order by col1) rn
        from yourtable
      ) x
      unpivot
      (
        val for col in (col1, col2, col3)
      ) u
    ) x1
    pivot
    (
      max(val)
      for rn in ([1], [2], [3], [4], [5])
    ) p
    

    데모와 SQL 바이올린을 참조하십시오. 필요한 경우이 동적으로 수행 할 수 있습니다.

    열 순서 요구가 계속 될 경우 편집, 당신은 여기에 비 결정적 행 번호를 사용하는 방법에 대한 기사는 (테이블의 열 중 하나에 의해 순서를 사용하지 않고 ROW_NUMBER을 적용 같은 것을 ()를 사용할 수 있습니다 ) :

    select [1], [2], [3], [4], [5]
    from 
    (
      select *
      from
      (
        select col1, col2, col3,
          row_number() 
            over(order by (select 1)) rn
        from yourtable
      ) x
      unpivot
      (
        val for col in (col1, col2, col3)
      ) u
    ) x1
    pivot
    (
      max(val)
      for rn in ([1], [2], [3], [4], [5])
    ) p;
    

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

  2. from https://stackoverflow.com/questions/12696225/sql-real-transpose by cc-by-sa and MIT license