Jag experimenterade lite och det här är vad jag kom fram till.
# 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)
Om du inte bryr dig om ordningen på kolumnerna kan du bara göra SELECT DISTINCT * ...
Ersätter NULL
s med FALSE
kommer förmodligen att bli lite svårt med tanke på de 350 taggar du säger att du har. Så jag föreslår att du lämnar dem borta. Om du vill ha dem kan du göra SELECT DISTINCT date, id, species, illness, COALESCE(mucus, 'FALSE'), COALESCE(noisy, 'FALSE'),...
Det bittra pillret du måste svälja är dock att ange alla 350 taggar som kolumn med typ text
i as the tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text)
-en del av korstabellsatsen. Se till att placera dem i rätt ordning enligt 'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1'
även i korstabellsatsen.
Hoppas det var det du letade efter.