Reputation: 367
I have a table empl
with value such as:
empid id_val id_type
----------------------------
123456 ABCD1234XY SSN
123456 U9876512 PASSPORT
123456 9090876543 UID
123456 V2345677 VOTERID
123457 ABCD1235YZ SSN
123457 V8765120 PASSPORT
123457 8090876541 UID
123457 A2342627 VOTERID
123458 ABCD1236ZZ SSN
123458 X9876510 PASSPORT
123458 9090876599 UID
123459 ABCD1238YY SSN
123459 8080876549 UID
123459 Z2345678 VOTERID
I want output like list of ID type as column means:
empid SSN PASSPORT UID VOTERID
--------------------------------------------------
123456 ABCD1234XY U9876512 9090876543 V2345677
123457 ABCD1235YZ V8765120 8090876541 A2342627
123458 ABCD1236ZZ X9876510 9090876599 NULL
123459 ABCD1238YY NULL 8080876549 Z2345678
Could you please help me to get output like above format having value mention as top.
Upvotes: 0
Views: 60
Reputation: 168257
You can use PIVOT
:
SELECT *
FROM table_name
PIVOT (
MAX( id_val )
FOR id_type IN (
'SSN' AS ssn,
'PASSPORT' AS passport,
'UID' AS "UID",
'VOTERID' AS voterid
)
)
ORDER BY empid;
Which, for the sample data:
CREATE TABLE table_name ( empid, id_val, id_type ) AS
SELECT 123456, 'ABCD1234XY', 'SSN' FROM DUAL UNION ALL
SELECT 123456, 'U9876512', 'PASSPORT' FROM DUAL UNION ALL
SELECT 123456, '9090876543', 'UID' FROM DUAL UNION ALL
SELECT 123456, 'V2345677', 'VOTERID' FROM DUAL UNION ALL
SELECT 123457, 'ABCD1235YZ', 'SSN' FROM DUAL UNION ALL
SELECT 123457, 'V8765120', 'PASSPORT' FROM DUAL UNION ALL
SELECT 123457, '8090876541', 'UID' FROM DUAL UNION ALL
SELECT 123457, 'A2342627', 'VOTERID' FROM DUAL UNION ALL
SELECT 123458, 'ABCD1236ZZ', 'SSN' FROM DUAL UNION ALL
SELECT 123458, 'X9876510', 'PASSPORT' FROM DUAL UNION ALL
SELECT 123458, '9090876599', 'UID' FROM DUAL UNION ALL
SELECT 123459, 'ABCD1238YY', 'SSN' FROM DUAL UNION ALL
SELECT 123459, '8080876549', 'UID' FROM DUAL UNION ALL
SELECT 123459, 'Z2345678', 'VOTERID' FROM DUAL;
Outputs:
EMPID | SSN | PASSPORT | UID | VOTERID -----: | :--------- | :------- | :--------- | :------- 123456 | ABCD1234XY | U9876512 | 9090876543 | V2345677 123457 | ABCD1235YZ | V8765120 | 8090876541 | A2342627 123458 | ABCD1236ZZ | X9876510 | 9090876599 | null 123459 | ABCD1238YY | null | 8080876549 | Z2345678
db<>fiddle here
Upvotes: 1
Reputation: 1270421
You can use conditional aggregation:
select empid,
max(case when id_val = 'SSN' then id_type end) as SSN,
max(case when id_val = 'PASSPORT' then id_type end) as PASSPORT,
max(case when id_val = 'UID' then id_type end) as UID,
max(case when id_val = 'VOTERID' then id_type end) as VOTERID
from t
group by empid;
Upvotes: 1