PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Pivot w Postgresql z oznaczeniami TRUE/FALSE

Trochę poeksperymentowałem i to właśnie wymyśliłem.

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

Jeśli nie zależy Ci na kolejności kolumn, możesz po prostu zrobić SELECT DISTINCT * ...

Zastąpienie NULL s z FALSE będzie prawdopodobnie trochę trudne, biorąc pod uwagę 350 tagów, które twierdzisz, że masz. Więc radzę je zostawić. Jeśli chcesz, możesz wykonać SELECT DISTINCT date, id, species, illness, COALESCE(mucus, 'FALSE'), COALESCE(noisy, 'FALSE'),...

Jednak gorzka pigułka, którą będziesz musiał połknąć, to określenie wszystkich 350 tagów jako kolumny z typem text w as the tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text) -część instrukcji crosstab. Upewnij się, że ułożyłeś je we właściwej kolejności, określonej przez 'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1' również w instrukcji crosstab.

Mam nadzieję, że tego właśnie szukałeś.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. dblink nie istnieje, nawet jeśli rozszerzenie już istnieje?

  2. Zapytanie SQL pasujące do jednego z wielu ciągów

  3. WYBIERZ w JSONField z Django

  4. Czy mogę dynamicznie obcinać tabele?

  5. Postgresql Drop View