3

I have a multi select query

SELECT C.CATEGORIES_NAME 
FROM CATEGORIES AS C 
WHERE CATEGORIES_ID = 1

UNION

SELECT L.LOCATION_TYPE_NAME 
FROM LOCATIONS_TYPE AS L 
WHERE LOCATION_TYPE_ID = 2 

UNION

SELECT S.SUBSCRIPTION_TYPE 
FROM SUBSCRIPTIONS AS S 
WHERE SUBSCRIPTION_ID = 3

He gives me the result:

 CATEGORIES_NAME |
------------------
       free      |
       Plaza     |
      Mobiles    |

And I need to get this result:

 CATEGORIES_NAME | LOCATION_TYPE_NAME | SUBSCRIPTION_TYPE |
-----------------------------------------------------------
       free      |       Plaza        |      Mobiles      |

How can this be done?

MegaRoks
  • 898
  • 2
  • 13
  • 30

2 Answers2

1

Use crosstab() - for reference you can check the details here

CREATE EXTENSION tablefunc;
    SELECT *
    FROM crosstab(
        'SELECT C.CATEGORIES_NAME 
    FROM CATEGORIES AS C 
    WHERE CATEGORIES_ID = 1

    UNION

    SELECT L.LOCATION_TYPE_NAME 
    FROM LOCATIONS_TYPE AS L 
    WHERE LOCATION_TYPE_ID = 2 

    UNION

    SELECT S.SUBSCRIPTION_TYPE 
    FROM SUBSCRIPTIONS AS S 
    WHERE SUBSCRIPTION_ID = 3'
    ) AS ct(CATEGORIES_NAME text, LOCATION_TYPE_NAME text, SUBSCRIPTION_TYPE text)
Fahmi
  • 37,315
  • 5
  • 22
  • 31
1

I think the simplest solution is to basically put SELECT before the queries:

SELECT (SELECT C.CATEGORIES_NAME 
        FROM CATEGORIES AS C 
        WHERE CATEGORIES_ID = 1
       ) as CATEGORIES_NAME,
       (SELECT L.LOCATION_TYPE_NAME 
        FROM LOCATIONS_TYPE AS L 
        WHERE LOCATION_TYPE_ID = 2
       ) as LOCATION_TYPE_NAME,
       (SELECT S.LOCATION_TYPE_NAME 
        FROM SUBSCRIPTIONS AS S 
        WHERE SUBSCRIPTION_ID = 3
       ) as LOCATION_TYPE_NAME;
Gordon Linoff
  • 1,242,037
  • 58
  • 646
  • 786