Search code examples
sqlsql-serverpivotpivot-tableunpivot

Pivot and unpivot a table with multiple columns and Rows in SQL


I need to output this below table as following. Below is existing database table output.

UNIQUE_ID   PARTICULARS                   18-Jan    18-Feb    18-Mar
-----       -----                         -----     -----     -----
1           Direct Cost                   3,393     3,776     3,776
1           Quarter                       Q3 FY18   Q3 FY18   Q3 FY18
1           Revenue net Volume Discount   4,409     5,787     5,512
2           Direct Cost                   25,022    39,178    34,143
2           Quarter                       Q2 FY18   Q2 FY18   Q2 FY18
2           Revenue net Volume Discount   28,730    45,507    38,247

I need to convert above table to below output.

UNIQUE_ID   FinancialMonth  Quarter     DirectCost  Revenue net Volume Discount
1           18-Jan          Q3 FY18     3,393       4,409
1           18-Feb          Q3 FY18     3,776       5,787
1           18-Mar          Q3 FY18     3,776       5,512
2           18-Jan          Q2 FY18     25,022      28,730
2           18-Feb          Q2 FY18     39,178      45,507
2           18-Mar          Q2 FY18     34,143      38,247

Could you help me on this to convert it. I have converted FinancialMonth using unpivot, but I could not convert Quarter as Column.

SELECT UNIQUE_ID
       ,PARTICULARS
       ,[FinancialYearMonth] AS 'FinancialMonth'
       ,CASE WHEN PARTICULARS='Direct Cost'   
             THEN [FinancialValues] END AS [DirectCost]
       ,CASE WHEN PARTICULARS='Revenue net Volume Discount'   
             THEN [FinancialValues] END AS [RevenueNetVolumeDiscount]

FROM DBO.Raw_Monthly
UNPIVOT   
  ( 
        FinancialValues
    FOR [FinancialYearMonth] IN(
       Jan18
      ,[Feb18]
      ,[Mar18]


       ) 
   ) AS unpv 

In above query Quarter values are missing.

Both FinancialMonth and Quarter might be unpivot and pivot on same time as my understanding. Could you please help on this.


Solution

  • The tried query is missing pivoting ( Conditional Aggregation, e.g. case..when clauses containing Aggregation through Grouping ) after unpivoting. Therefore, consider :

     SELECT [Unique_ID], [FinancialMonth], 
            MAX(CASE WHEN [Particulars]='Quarter' THEN [FinancialValues] END) AS [Quarter],
            MAX(CASE WHEN [Particulars]='Direct Cost' THEN [FinancialValues] END) AS [DirectCost],
            MAX(CASE WHEN [Particulars]='Revenue net Volume Discount' THEN [FinancialValues] 
            END) AS [Revenue net Volume Discount]
       FROM Raw_Monthly
    UNPIVOT  
       (
        [FinancialValues] FOR [FinancialMonth] IN ( [18-Jan] ,[18-Feb] ,[18-Mar] ) 
       ) AS unpvt
      GROUP BY [Unique_ID], [FinancialMonth]
      ORDER BY [Unique_ID], 
               CONVERT(date, REVERSE(SUBSTRING(REVERSE([FinancialMonth]),1,3))+
                      ' 20'+  SUBSTRING(REPLACE([FinancialMonth],'-',''),1,2) , 13)
    

    Demo