[SQL] 어떻게 피벗 행과 열로 (사용자 정의 회전)
SQL어떻게 피벗 행과 열로 (사용자 정의 회전)
나는 다음과 같은 SQL 데이터베이스 테이블이 있습니다 :
Day Period Subject
Mon 1 Ch
Mon 2 Ph
Mon 3 Mth
Mon 4 CS
Mon 5 Lab1
Mon 6 Lab2
Mon 7 Lab3
Tue 1 Ph
Tue 2 Ele
Tue 3 Hu
Tue 4 Ph
Tue 5 En
Tue 6 CS2
Tue 7 Mth
다음과 같이 나는 그것이 표시 싶습니다 종류를 크로스 탭 또는 피벗의
Day P1 P2 P3 P4 P5 P6 P7
Mon Ch Ph Mth CS2 Lab1 Lab2 Lab3
Tue Ph Ele Hu Ph En CS2 Mth
무엇을 할 수있는 이상적인 방법이 될 것입니다? 누군가가 나에게 SQL 코드 좀 보여 주시겠습니까?
해결법
-
==============================
1.당신은 아마 PIVOT 기능을 할 수있는,하지만 난 구식 방법을 선호한다 :
당신은 아마 PIVOT 기능을 할 수있는,하지만 난 구식 방법을 선호한다 :
SELECT dy, MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1, MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2, MAX(CASE WHEN period = 3 THEN subj ELSE NULL END) AS P3, MAX(CASE WHEN period = 4 THEN subj ELSE NULL END) AS P4, MAX(CASE WHEN period = 5 THEN subj ELSE NULL END) AS P5, MAX(CASE WHEN period = 6 THEN subj ELSE NULL END) AS P6, MAX(CASE WHEN period = 7 THEN subj ELSE NULL END) AS P7 FROM Classes GROUP BY dy ORDER BY CASE dy WHEN 'Mon' THEN 1 WHEN 'Tue' THEN 2 WHEN 'Wed' THEN 3 WHEN 'Thu' THEN 4 WHEN 'Fri' THEN 5 WHEN 'Sat' THEN 6 WHEN 'Sun' THEN 7 ELSE 8 END
-
==============================
2.그냥 당신이 새로운 학교 방법을 원하는가 넣다. (피벗 문 SQL2005 + 작동한다 값은 예를 들어 데이터 비트 전용 SQL2008)
그냥 당신이 새로운 학교 방법을 원하는가 넣다. (피벗 문 SQL2005 + 작동한다 값은 예를 들어 데이터 비트 전용 SQL2008)
WITH ExampleData AS ( SELECT X.* FROM (VALUES ('Mon', 1, 'Ch'), ('Mon', 2, 'Ph'), ('Mon', 3, 'Mth'), ('Mon', 4, 'CS'), ('Mon', 5, 'Lab1'), ('Mon', 6, 'Lab2'), ('Mon', 7, 'Lab3'), ('Tue', 1, 'Ph'), ('Tue', 2, 'Ele'), ('Tue', 3, 'Hu'), ('Tue', 4, 'Ph'), ('Tue', 5, 'En'), ('Tue', 6, 'CS2'), ('Tue', 7, 'Mth') ) AS X (Day, Period, Subject) ) SELECT Day, [1] AS P1, [2] AS P2,[3] AS P3, [4] AS P4, [5] AS P5,[6] AS P6,[7] AS P7 FROM ExampleData PIVOT ( Max(Subject) FOR Period IN ([1], [2],[3],[4], [5],[6], [7]) ) AS PivotTable;
결과
Day P1 P2 P3 P4 P5 P6 P7 ---- ---- ---- ---- ---- ---- ---- ---- Mon Ch Ph Mth CS Lab1 Lab2 Lab3 Tue Ph Ele Hu Ph En CS2 Mth
-
==============================
3.당신은 시도 할 수 ...
당신은 시도 할 수 ...
SELECT DISTINCT Day, (SELECT Subject FROM my_table mt2 WHERE mt2.Day = mt.Day AND Period = 1) AS P1, (SELECT Subject FROM my_table mt2 WHERE mt2.Day = mt.Day AND Period = 2) AS P2, . . etc . . . (SELECT Subject FROM my_table mt2 WHERE mt2.Day = mt.Day AND Period = 7) AS P7 FROM my_table mt;
하지만 난 아주 많이 좋아 말할 수 없습니다. 더 나은없는 것보다는, 그래도.
-
==============================
4.하나의 열에 쉼표로 구분 된 형식의 모든 값을 얻기 위해 적용 교차 사용합니다. 대신에 "7"다른 열. 다음 쿼리는 어떤 칼럼 -> 행 매핑에 사용 할 수 있습니다
하나의 열에 쉼표로 구분 된 형식의 모든 값을 얻기 위해 적용 교차 사용합니다. 대신에 "7"다른 열. 다음 쿼리는 어떤 칼럼 -> 행 매핑에 사용 할 수 있습니다
SELECT DISTINCT Day, [DerivedColumn] FROM <Table> A CROSS APPLY ( SELECT Period + ',' FROM <Table> B WHERE A.Day = B.Day Order By Period FOR XML PATH('') ) AS C (DerivedColumn)
당신은 [채널, 박사, M 번째, CS2, LAB1, LAB2, Lab3는 하나 개의 컬럼 월에 등등 ...에 당신은 어떤 특정한 날에 대한 쿼리에 테이블로 사용할 수 있습니다 얻을 것이다.
도움이 되었기를 바랍니다
-
==============================
5.
DECLARE @TIMETABLE TABLE ( [Day] CHAR(3), [Period] TINYINT, [Subject] CHAR(5) ) INSERT INTO @TIMETABLE([Day], [Period], [Subject]) VALUES ('Mon', 1, 'Ch'), ('Mon', 2, 'Ph'), ('Mon', 3, 'Mth'), ('Mon', 4, 'CS'), ('Mon', 5, 'Lab1'), ('Mon', 6, 'Lab2'), ('Mon', 7, 'Lab3'), ('Tue', 1, 'Ph'), ('Tue', 2, 'Ele'), ('Tue', 3, 'Hu'), ('Tue', 4, 'Ph'), ('Tue', 5, 'En'), ('Tue', 6, 'CS2'), ('Tue', 7, 'Mth') SELECT [Day], MAX(CASE [Period] WHEN 1 THEN [Subject] END) AS P1, MAX(CASE [Period] WHEN 2 THEN [Subject] END) AS P2, MAX(CASE [Period] WHEN 3 THEN [Subject] END) AS P3, MAX(CASE [Period] WHEN 4 THEN [Subject] END) AS P4, MAX(CASE [Period] WHEN 5 THEN [Subject] END) AS P5, MAX(CASE [Period] WHEN 6 THEN [Subject] END) AS P6, MAX(CASE [Period] WHEN 7 THEN [Subject] END) AS P7 FROM @TIMETABLE GROUP BY [Day]
-
==============================
6.
with pivot_data as ( select [day], -- groping column period, -- spreading column subject -- aggreate column from pivot_tb ) select [day], [1] AS P1, [2] AS P2,[3] AS P3, [4] AS P4, [5] AS P5,[6] AS P6,[7] AS P7 from pivot_data pivot ( max(subject) for period in ([1], [2],[3],[4], [5],[6], [7]) ) as p;
from https://stackoverflow.com/questions/3120835/how-to-pivot-rows-into-columns-custom-pivoting by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] DISTINCT 여러 열을 선택 MYSQL (0) | 2020.04.15 |
---|---|
[SQL] SQL 서버는 가장 최근의 값을 사용하여 별개의 행을 선택 (0) | 2020.04.15 |
[SQL] 두 날짜 사이의 계산 업무 시간 (0) | 2020.04.15 |
[SQL] 합니까 MySQL은 MSSQL처럼 @@ ROWCOUNT에 해당하는가? (0) | 2020.04.14 |
[SQL] 어떻게 SQL 서버의 저장 프로 시저 매 시간마다 실행? (0) | 2020.04.14 |