sql >> Database >  >> RDS >> PostgreSQL

Draai in Postgresql met TRUE/FALSE-markeringen

Ik heb een beetje geëxperimenteerd en dit is wat ik bedacht.

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

Als u niet om de volgorde van de kolommen geeft, kunt u gewoon SELECT DISTINCT * ... doen

De NULL vervangen s met FALSE zal waarschijnlijk een beetje moeilijk zijn gezien de 350 tags die je zegt te hebben. Dus ik stel voor ze weg te laten. Als je ze wel wilt, kun je SELECT DISTINCT date, id, species, illness, COALESCE(mucus, 'FALSE'), COALESCE(noisy, 'FALSE'),... doen

De bittere pil die u echter zult moeten slikken, is om alle 350 tags op te geven als kolom met het type text in as the tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text) -deel van de kruistabelverklaring. Zorg ervoor dat u ze in de juiste volgorde plaatst, zoals bepaald door 'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1' ook in de kruistabel.

Ik hoop dat dat is wat je zocht.



  1. Django reset auto-increment pk/id veld voor productie

  2. PostgreSQL 'NIET IN' en subquery

  3. Maanden aftrekken van een datum in PostgreSQL

  4. Zijn gebruikers 'Gebruiker'@'%' en 'Gebruiker'@'localhost' niet hetzelfde?