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

Pivot i Postgresql med TRUE/FALSE markeringer

Jeg eksperimenterede lidt, og det er det, jeg kom frem til.

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

Hvis du er ligeglad med rækkefølgen af ​​kolonnerne, kan du bare gøre SELECT DISTINCT * ...

Udskiftning af NULL s med FALSE bliver nok lidt svært i betragtning af de 350 tags du siger du har. Så jeg foreslår at lade dem væk. Hvis du vil have dem, kan du gøre SELECT DISTINCT date, id, species, illness, COALESCE(mucus, 'FALSE'), COALESCE(noisy, 'FALSE'),...

Den bitre pille, du dog bliver nødt til at sluge, er at angive alle 350 tags som kolonne med typen text i as the tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text) -en del af krydstabuleringserklæringen. Sørg for at placere dem i den rigtige rækkefølge som bestemt af 'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1' også i krydstabuleringserklæringen.

Håber det var det, du ledte efter.



  1. Kan ikke oprette forbindelse til MySQL-server på (ip eller domænenavn)

  2. CTE og fødselsdagsparadokset

  3. Betydning af firkantede parenteser [] i MS-SQL tabeldesigner?

  4. jOOQ EXTRACT(EPOCH FRA [field]) løsning?