PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Pivot in Postgresql con contrassegni VERO/FALSO

Ho sperimentato un po' e questo è quello che mi è venuto in mente.

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

Se non ti interessa l'ordine delle colonne puoi semplicemente fare SELECT DISTINCT * ...

Sostituzione di NULL s con FALSE probabilmente sarà un po' difficile considerando i 350 tag che dici di avere. Quindi suggerisco di lasciarli da parte. Se li vuoi puoi fare SELECT DISTINCT date, id, species, illness, COALESCE(mucus, 'FALSE'), COALESCE(noisy, 'FALSE'),...

La pillola amara che dovrai ingoiare comunque è specificare tutti i 350 tag come colonna con tipo text in as the tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text) -parte dell'istruzione a campi incrociati. Assicurati di metterli nell'ordine corretto come determinato da 'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1' anche nella tabella a campi incrociati.

Spero sia quello che stavi cercando.