Understanding PIVOT function in T-SQL

后端 未结 6 2160
梦谈多话
梦谈多话 2020-11-22 09:06

I am very new to SQL.

I have a table like this:

ID | TeamID | UserID | ElementID | PhaseID | Effort
-------------------------------------------------         


        
6条回答
  •  再見小時候
    2020-11-22 09:53

    Ive something to add here which no one mentioned.

    The pivot function works great when the source has 3 columns: One for the aggregate, one to spread as columns with for, and one as a pivot for row distribution. In the product example it's QTY, CUST, PRODUCT.

    However, if you have more columns in the source it will break the results into multiple rows instead of one row per pivot based on unique values per additional column (as Group By would do in a simple query).

    See this example, ive added a timestamp column to the source table:

    Now see its impact:

    SELECT CUST, MILK
    
    FROM Product
    -- FROM (SELECT CUST, Product, QTY FROM PRODUCT) p
    PIVOT (
        SUM(QTY) FOR PRODUCT IN (MILK)
    ) AS pvt
    
    ORDER BY CUST
    


    In order to fix this, you can either pull a subquery as a source as everyone has done above - with only 3 columns (this is not always going to work for your scenario, imagine if you need to put a where condition for the timestamp).

    Second solution is to use a group by and do a sum of the pivoted column values again.

    SELECT 
    CUST, 
    sum(MILK) t_MILK
    
    FROM Product
    PIVOT (
        SUM(QTY) FOR PRODUCT IN (MILK)
    ) AS pvt
    
    GROUP BY CUST
    ORDER BY CUST
    
    GO
    

提交回复
热议问题