복붙노트

[SQL] 열 값으로 행 값을 만들기 - SQL PIVOT

SQL

열 값으로 행 값을 만들기 - SQL PIVOT

SQL은 테이블에서 다음과 같은 결과를 반환 CowTracking를

    ID  cow_id  barn_id
    --  ------  -------
    19    5       3
    20    5       2
    21    5       9
    22    5       1

나는 SQL에서 PIVOT과 함께 다음과 같은 결과를 얻기 위해 노력하고 있어요

     cow_id  barn1  barn2  barn3  barn4
     ------  -----  -----  -----  -----
       5       3      2      9      1

이것은 내가 지금까지 가지고있는 코드입니다.

    SELECT *
    FROM 
    (
        SELECT TOP 4 *
        FROM CowTracking
            WHERE cow_id = 5
    ) AS DataTable
    PIVOT
    (
        MIN(barn_id) **IDK what function to use and which column to use it on**
        FOR ID  ??<---**NOT SURE**
        IN 
        (
        [barn1], [barn2], [barn3], [barn4]
        )
    ) AS PivotTable


    ERRORS: Error converting data type nvarchar to int
            The incorrect value "barn1" is supplied in the PIVOT operator

참고 : barn_id은 VARCHAR입니다. 이 데이터 유형을 변경 할 수 없습니다.

나는 / 곱하기 / 집계 또는 무엇이든을 추가하려고하고 있지 않다. 단순히 열에 행을 이동하는 것을 시도하고있다

나는이 일에 대해 어떻게 갈 것인가? 이 올바른 생각 과정인가?

난 PIVOT을 사용해야합니까?

해결법

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

    1.당신의 테이블에는 barn1..4이 없기 때문에, 당신은 어떻게 든 자신의 해당 축사와 ID의를 교체해야합니다.

    당신의 테이블에는 barn1..4이 없기 때문에, 당신은 어떻게 든 자신의 해당 축사와 ID의를 교체해야합니다.

    PIVOT을 사용하여 하나 개의 솔루션은 다음과 같이 수 있습니다

    SELECT  cow_id
            , [19] as [barn1]
            , [20] as [barn2]
            , [21] as [barn3]
            , [22] as [barn4]
    FROM    (       
                SELECT  *
                FROM    DataTable
                PIVOT   (   MIN(barn_id)
                            FOR ID IN ([19], [20], [21], [22])
                        ) AS PivotTable
            ) q                 
    

    다른 솔루션을 사용하여 CASE 및 GROUP BY가 될 수있다

    SELECT  cow_id
            , [barn1] = SUM(CASE WHEN ID = 19 THEN barn_id END)
            , [barn2] = SUM(CASE WHEN ID = 20 THEN barn_id END)
            , [barn3] = SUM(CASE WHEN ID = 21 THEN barn_id END)
            , [barn4] = SUM(CASE WHEN ID = 22 THEN barn_id END)
    FROM    DataTable
    GROUP BY
            cow_id
    

    그러나 본질적으로,이 모든 헛간에 ID를 하드 코딩으로 요약된다.

    편집하다

    당신은 항상 기록의 고정 수를 반환하고, SQL Server를 사용하는 경우이 좀 더 강력한으로 만들 수도 있습니다

    SQL 문

    SELECT  cow_id  
            , [barn1] = SUM(CASE WHEN rn = 1 THEN barn_id END)
            , [barn2] = SUM(CASE WHEN rn = 2 THEN barn_id END)
            , [barn3] = SUM(CASE WHEN rn = 3 THEN barn_id END)
            , [barn4] = SUM(CASE WHEN rn = 4 THEN barn_id END)
    FROM    (
                SELECT  cow_id
                        , rn = ROW_NUMBER() OVER (ORDER BY ID)
                        , barn_id
                FROM    DataTable       
            ) q
    GROUP BY
            cow_id
    

    테스트 스크립트

    ;WITH DataTable (ID, cow_id, barn_id) AS (
        SELECT * FROM (VALUES 
            (19, 5, 3)
            , (20, 5, 2)
            , (21, 5, 9)
            , (22, 5, 1)
        ) AS q (a, b, c)        
    )
    SELECT  cow_id  
            , [barn1] = SUM(CASE WHEN rn = 1 THEN barn_id END)
            , [barn2] = SUM(CASE WHEN rn = 2 THEN barn_id END)
            , [barn3] = SUM(CASE WHEN rn = 3 THEN barn_id END)
            , [barn4] = SUM(CASE WHEN rn = 4 THEN barn_id END)
    FROM    (
                SELECT  cow_id
                        , rn = ROW_NUMBER() OVER (ORDER BY ID)
                        , barn_id
                FROM    DataTable       
            ) q
    GROUP BY
            cow_id
    
  2. from https://stackoverflow.com/questions/9117955/making-row-values-into-column-values-sql-pivot by cc-by-sa and MIT license