Using pivot table with column and row totals in sql server 2008

后端 未结 3 881
天命终不由人
天命终不由人 2020-12-09 05:36

I have a table with following columns

defect_id, developer_name, status, summary, root_cause, 
Secondary_RC, description, Comments, environment_name
         


        
3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-09 05:50

    You can find Total for root_cause and environment_name using ROLLUP.

    • RNO_COLTOTAL - Logic to place Total in last column, since the columns Tsc,Unkn will overlap the column Total when pivoting, since its ordering alphabetically.
    • RNO_ROWTOTAL - Logic to place Total in last row since a value that is starting with U,W,X,Y,Z can overlap the value Total, since its ordering alphabetically.
    • SUM(VALUE) - Can define on what aggregate function we can use with ROLLUP.

    QUERY 1

    SELECT CASE WHEN root_cause IS NULL THEN 1 ELSE 0 END RNO_COLTOTAL, 
    CASE WHEN environment_name IS NULL THEN 1 ELSE 0 END RNO_ROWTOTAL,
    ISNULL(environment_name,'Total')environment_name,
    ISNULL(root_cause,'Total')root_cause,
    SUM(VALUE) VALUE
    INTO #NEWTABLE
    FROM
    (
        -- Find the count for environment_name,root_cause
        SELECT DISTINCT *,COUNT(*) OVER(PARTITION BY environment_name,root_cause)VALUE 
        FROM #TEMP
    )TAB
    GROUP BY root_cause,environment_name
    WITH CUBE
    

    We will get the following logic when CUBE is used

    enter image description here

    We declare variables for pivoting.

    • @cols - Column values for pivoting.
    • @NulltoZeroCols - Replace null values with zero.

    QUERY 2

    DECLARE @cols NVARCHAR (MAX)
    
    SELECT @cols = COALESCE (@cols + ',[' + root_cause + ']', 
                   '[' + root_cause + ']')
                   FROM    (SELECT DISTINCT RNO_COLTOTAL,root_cause FROM #NEWTABLE) PV 
                   ORDER BY  RNO_COLTOTAL,root_cause 
    
    DECLARE @NulltoZeroCols NVARCHAR (MAX)
    
    SET @NullToZeroCols = SUBSTRING((SELECT ',ISNULL(['+root_cause+'],0) AS ['+root_cause+']' 
    FROM(SELECT DISTINCT RNO_COLTOTAL,root_cause FROM #NEWTABLE GROUP BY RNO_COLTOTAL,root_cause)TAB  
    ORDER BY RNO_COLTOTAL  FOR XML PATH('')),2,8000) 
    

    Now pivot it dynamically

    DECLARE @query NVARCHAR(MAX)
    SET @query = 'SELECT environment_name,'+ @NulltoZeroCols +' FROM 
                 (
                     SELECT RNO_ROWTOTAL,environment_name,root_cause,VALUE
                     FROM #NEWTABLE
                 ) x
                 PIVOT 
                 (
                     MIN(VALUE)
                     FOR [root_cause] IN (' + @cols + ')
                ) p
                ORDER BY RNO_ROWTOTAL,environment_name;' 
    
    EXEC SP_EXECUTESQL @query
    

    RESULT

    enter image description here

提交回复
热议问题