PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Pivot in Postgresql mit TRUE/FALSE-Markierungen

Ich habe ein bisschen herumexperimentiert und das ist dabei herausgekommen.

# Reading the data into a table

SELECT * INTO crosstab_test FROM 
(VALUES (20180101,'001','Dog','Asthma','Mucus'),
(20180101,'001','Dog','Asthma','Noisy'),
(20180101,'001','Dog','Asthma','Respiratory'),
(20180102,'002','Cat','Osteoarthritis','Locomotor'),
(20180102,'002','Cat','Osteoarthritis','Limp'),
(20180131, '003', 'Bird', 'Avian Pox','Itchy')) as a (date, id, species, illness, tag);

SELECT DISTINCT date, id, species, illness, mucus, noisy, locomotor, respiratory,  limp, itchy 
FROM 
(SELECT "date", id, species, illness
FROM crosstab_test) a
INNER JOIN             
(SELECT * FROM crosstab(
'SELECT id, tag, ''TRUE'' FROM crosstab_test ORDER BY 1,2,3',
'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1')
as tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text)) b
USING(id)
ORDER BY 1;


   date   | id  | species |    illness     | mucus | noisy | locomotor | respiratory | limp | itchy
----------+-----+---------+----------------+-------+-------+-----------+-------------+------+-------
 20180101 | 001 | Dog     | Asthma         | TRUE  | TRUE  |           | TRUE        |      |
 20180102 | 002 | Cat     | Osteoarthritis |       |       | TRUE      |             | TRUE |
 20180131 | 003 | Bird    | Avian Pox      |       |       |           |             |      | TRUE
(3 Zeilen)

Wenn Ihnen die Reihenfolge der Spalten egal ist, können Sie einfach SELECT DISTINCT * ... ausführen

Ersetzen von NULL s mit FALSE wird wahrscheinlich ein wenig schwierig sein, wenn man bedenkt, dass Sie 350 Tags haben. Ich schlage daher vor, sie wegzulassen. Wenn Sie sie haben möchten, können Sie Folgendes tun:SELECT DISTINCT date, id, species, illness, COALESCE(mucus, 'FALSE'), COALESCE(noisy, 'FALSE'),...

Die bittere Pille, die Sie allerdings schlucken müssen, ist, alle 350 Tags als Spalte vom Typ text anzugeben in as the tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text) -Teil der Kreuztabellen-Anweisung. Achten Sie darauf, sie in die richtige Reihenfolge zu bringen, wie durch 'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1' festgelegt auch in der Kreuztabellen-Anweisung.

Ich hoffe, das ist, wonach Sie gesucht haben.