복붙노트

[SQL] 여러 열이있는 SQL 피벗

SQL

여러 열이있는 SQL 피벗

SQL Server 2008의 피벗 절과 도움이 필요하십니까. 나는이 정보가있는 테이블이 있습니다

Weekno 된 요일 FROMTIME TOTIME 1 2 10시 14시 1~3 10시 14시 2 3 8시 13시 2-4 9시 13시 2~5 14시 22시 3 1 6시 13시 3 4 6시 13시 3-5 14시 22시

나는 모습이 좋아하는 테이블에이를 변환 할 : 주 Start1 END1 START2 END2 Start3 End3 Start4 End4 Start5 End5 Start6 End6 Start7 End7 1 10시 14시 10시 14시 2 8시 13시 9시 13시 14시 22시 3 6시 13시 6시 13시 14시 22시

피벗 쿼리와 함께 할 수있는 방법이 있습니까? 그것을 수행하는 방법에 대한 예제와 함께 응답을 보냅니다.

나는이에 대한 도움말의 모든 종류를 주셔서 감사합니다. 미리 감사드립니다.

해결법

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

    1.여기에 피벗 버전입니다 :

    여기에 피벗 버전입니다 :

    https://data.stackexchange.com/stackoverflow/query/7295/so3241450

    -- SO3241450
    
    CREATE TABLE #SO3241450 (
        Weekno int NOT NULL
        ,DayOfWeek int NOT NULL
        ,FromTime time NOT NULL
        ,ToTime time NOT NULL
    )
    
    INSERT INTO #SO3241450 VALUES
    (1, 2, '10:00', '14:00')
    ,(1, 3, '10:00', '14:00')
    ,(2, 3, '08:00', '13:00')
    ,(2, 4, '09:00', '13:00')
    ,(2, 5, '14:00', '22:00')
    ,(3, 1, '06:00', '13:00')
    ,(3, 4, '06:00', '13:00')
    ,(3, 5, '14:00', '22:00')
    
    ;WITH Base AS (
        SELECT Weekno, DayOfWeek, FromTime AS [Start], ToTime AS [End]
        FROM #SO3241450
    )
    ,norm AS (
    SELECT Weekno, ColName + CONVERT(varchar, DayOfWeek) AS ColName, ColValue
    FROM Base
    UNPIVOT (ColValue FOR ColName IN ([Start], [End])) AS pvt
    )
    SELECT *
    FROM norm
    PIVOT (MIN(ColValue) FOR ColName IN ([Start1], [End1], [Start2], [End2], [Start3], [End3], [Start4], [End4], [Start5], [End5], [Start6], [End6], [Start7], [End7])) AS pvt​
    
  2. ==============================

    2.나는 개인적으로 읽기 어려운 pivots-하고 다루기 싫어.

    나는 개인적으로 읽기 어려운 pivots-하고 다루기 싫어.

    CREATE TABLE #test
    (
        WeekNo int,
        [DayOfWeek] int,
        FromTime time,
        ToTime time
        )
    
    INSERT INTO #test
    SELECT 1,2,'10:00','14:00'
    UNION ALL
    SELECT 1,3,'10:00','14:00'
    UNION ALL
    SELECT 2,3,'08:00','13:00'
    UNION ALL
    SELECT 2,4,'09:00','13:00'
    UNION ALL
    SELECT 2,5,'14:00','22:00'
    UNION ALL
    SELECT 3,1,'06:00','13:00'
    UNION ALL
    SELECT 3,4,'06:00','13:00'
    UNION ALL
    SELECT 3,5,'14:00','22:00'
    
    SELECT WeekNo, 
        MAX(CASE WHEN DayOfWeek = 1 THEN FromTime ELSE NULL END)  AS Start1,
        MAX(CASE WHEN DayOfWeek = 1 THEN ToTime ELSE NULL END)  AS End1,
        MAX(CASE WHEN DayOfWeek = 2 THEN FromTime ELSE NULL END)  AS Start2,
        MAX(CASE WHEN DayOfWeek = 2 THEN ToTime ELSE NULL END)  AS End2,
        MAX(CASE WHEN DayOfWeek = 3 THEN FromTime ELSE NULL END)  AS Start3,
        MAX(CASE WHEN DayOfWeek = 3 THEN ToTime ELSE NULL END)  AS End3,
        MAX(CASE WHEN DayOfWeek = 4 THEN FromTime ELSE NULL END)  AS Start4,
        MAX(CASE WHEN DayOfWeek = 4 THEN ToTime ELSE NULL END)  AS End4,
        MAX(CASE WHEN DayOfWeek = 5 THEN FromTime ELSE NULL END)  AS Start5,
        MAX(CASE WHEN DayOfWeek = 5 THEN ToTime ELSE NULL END)  AS End5,
        MAX(CASE WHEN DayOfWeek = 6 THEN FromTime ELSE NULL END)  AS Start6,
        MAX(CASE WHEN DayOfWeek = 6 THEN ToTime ELSE NULL END)  AS End6,
        MAX(CASE WHEN DayOfWeek = 7 THEN FromTime ELSE NULL END)  AS Start7,
        MAX(CASE WHEN DayOfWeek = 7 THEN ToTime ELSE NULL END)  AS End7
        FROM #test
        GROUP BY WeekNo
    

    그리고 피벗의 오프 양말을 날려 버릴거야; 성능 현명한.

  3. ==============================

    3.나는이 사건을 생각하는 것 그것은 단지 나머지에서 최신 시작 시간과 종료 시간 및 필터의 레코드를 반환합니다로만 독특한 Weekno와 DAYOFWEEK가있는 경우에만 작동합니다. 예

    나는이 사건을 생각하는 것 그것은 단지 나머지에서 최신 시작 시간과 종료 시간 및 필터의 레코드를 반환합니다로만 독특한 Weekno와 DAYOFWEEK가있는 경우에만 작동합니다. 예

    Weekno    DayOfWeek     FromTime    ToTime
    1         2             10:00       14:00
    1         2             07:00       09:00
    2         3             08:00       13:00
    2         4             09:00       13:00
    

    그것은 단지 DAYOFWEEK 2 weekno 1의 첫 번째 행을 반환하고, 제 2 열을 이동한다.

  4. from https://stackoverflow.com/questions/3241450/sql-pivot-with-multiple-columns by cc-by-sa and MIT license