PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Pivot no Postgresql com marcações TRUE/FALSE


Eu experimentei um pouco e foi isso que eu fiz.
# 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 você não se importa com a ordem das colunas, basta fazer SELECT DISTINCT * ...

Substituindo o NULL s com FALSE provavelmente será um pouco difícil, considerando as 350 tags que você diz ter. Então sugiro deixá-los de lado. Se você quiser, pode fazer SELECT DISTINCT date, id, species, illness, COALESCE(mucus, 'FALSE'), COALESCE(noisy, 'FALSE'),...

A pílula amarga que você terá que engolir é especificar todas as 350 tags como coluna com o tipo text em as the tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text) -parte da instrução crosstab. Certifique-se de colocá-los na ordem correta, conforme determinado por 'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1' também na instrução crosstab.

Espero que seja isso que você estava procurando.