[SQL] SQL은 전체 테이블을 바꾸어
SQLSQL은 전체 테이블을 바꾸어
나는 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.당신이 원하는 그 결과에 데이터를 바꾸어하기 위해, 당신은 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
from https://stackoverflow.com/questions/15297809/sql-transpose-full-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] rewriteBatchedStatements와 MySQL과 JDBC = TRUE (0) | 2020.03.19 |
---|---|
[SQL] MySQL은 공백으로 열 이름을 선택하는 방법 (0) | 2020.03.19 |
[SQL] SQL 아이덴티티 (일련 번호)는 트랜잭션 롤백으로도 증가 (0) | 2020.03.19 |
[SQL] 오라클의 LISTAGG는 고유 한 값을 반환 (0) | 2020.03.19 |
[SQL] 어떻게 마이크로 소프트 SQL 서버와 LIMIT를 구현하는 방법? (0) | 2020.03.19 |