Search code examples
sqloracle-databaseunpivot

How To display column names as rows in Oracle PL SQL


I have a query to get the count for some columns. I am getting output with no errors but i need it in different way. Can someone help me to get the below output in Oracle Pl/SQL?

SELECT   
SUM (DECODE(COLUMN1,'Y',1,0)) AS COUNT1,  
SUM (DECODE(COLUMN2,'Y',1,0)) AS COUNT2,  
SUM (DECODE(COLUMN3,'Y',1,0)) AS COUNT3,  
SUM (DECODE(COLUMN4,'Y',1,0)) AS COUNT4,  
SUM (DECODE(COLUMN5,'Y',1,0)) AS COUNT5,  
SUM (DECODE(COLUMN6,'Y',1,0)) AS COUNT6   
FROM TABLE_NAME  
WHERE COLUMN7 IN ('X','Y');

 **OUTPUT:**  
-----------------------------------------
COUNT1|COUNT2|COUNT3|COUNT4|COUNT5|COUNT6
-----------------------------------------
5500  | 1245 | 5245 | 5675 | 7845 | 5324
-----------------------------------------

**Required Output**

COUNT1 | 5500  
-------------
COUNT1 | 1245 
-------------
COUNT1 | 5245 
-------------
COUNT1 | 5675 
-------------
COUNT1 | 7845 
-------------
COUNT1 | 5324
-------------

Solution

  • Use UNION:

    SELECT 'Count1' AS "Count", SUM (DECODE(COLUMN1,'Y',1,0)) AS Total 
    FROM TABLE_NAME WHERE COLUMN7 IN ('X','Y')
    UNION ALL
    SELECT 'Count2' AS "Count", SUM (DECODE(COLUMN2,'Y',1,0)) AS Total 
    FROM TABLE_NAME WHERE COLUMN7 IN ('X','Y')
    UNION ALL
    SELECT 'Count3' AS "Count", SUM (DECODE(COLUMN3,'Y',1,0)) AS Total 
    FROM TABLE_NAME WHERE COLUMN7 IN ('X','Y')
    UNION ALL
    ...
    

    However, if you have a column to group by, you can just group by it and use the sum in one query.


    UPDATE:

    You can do this also by using UNPIVOT:

    SELECT *
    FROM
    (
      SELECT   
      SUM (DECODE(COLUMN1,'Y',1,0)) AS COUNT1,  
      SUM (DECODE(COLUMN2,'Y',1,0)) AS COUNT2,  
      SUM (DECODE(COLUMN3,'Y',1,0)) AS COUNT3,  
      SUM (DECODE(COLUMN4,'Y',1,0)) AS COUNT4,  
      SUM (DECODE(COLUMN5,'Y',1,0)) AS COUNT5,  
      SUM (DECODE(COLUMN6,'Y',1,0)) AS COUNT6   
      FROM TABLE_NAME  
      WHERE COLUMN7 IN ('X','Y')
    )
    UNPIVOT
    (
      Total
      FOR COL IN(COUNT1,COUNT2,COUNT3,COUNT4,COUNT5,COUNT6)
    )
    

    SQL Fiddle Demo