복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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;
    
  7. from https://stackoverflow.com/questions/3120835/how-to-pivot-rows-into-columns-custom-pivoting by cc-by-sa and MIT license