PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Pivot dans Postgresql avec les marquages ​​TRUE/FALSE

J'ai expérimenté un peu et c'est ce que j'ai trouvé.

# 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)

Si vous ne vous souciez pas de l'ordre des colonnes, vous pouvez simplement faire SELECT DISTINCT * ...

Remplacement du NULL s avec FALSE va probablement être un peu difficile compte tenu des 350 balises que vous dites avoir. Je propose donc de les laisser de côté. Si vous les voulez, vous pouvez faire SELECT DISTINCT date, id, species, illness, COALESCE(mucus, 'FALSE'), COALESCE(noisy, 'FALSE'),...

La pilule amère que vous devrez cependant avaler est de spécifier les 350 balises en tant que colonne avec le type text dans as the tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text) -partie de l'instruction de tableau croisé. Assurez-vous de les mettre dans le bon ordre tel que déterminé par 'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1' également dans l'instruction de tableau croisé.

J'espère que c'est ce que vous cherchiez.