PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Pivot в Postgresql с маркировки TRUE/FALSE

Експериментирах малко и ето какво измислих.

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

Ако не ви интересува редът на колоните, можете просто да направите SELECT DISTINCT * ...

Замяна на NULL s с FALSE вероятно ще бъде малко трудно, като се имат предвид 350-те етикета, които казвате, че имате. Затова предлагам да ги оставите настрана. Ако ги искате, можете да направите SELECT DISTINCT date, id, species, illness, COALESCE(mucus, 'FALSE'), COALESCE(noisy, 'FALSE'),...

Горчивият хап, който обаче ще трябва да преглътнете, е да посочите всичките 350 тагова като колона с тип text в as the tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text) -част от изявлението за кръстосана таблица. Не забравяйте да ги поставите в правилния ред, както е определено от 'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1' също и в изявлението за кръстосана таблица.

Надяваме се, че това е, което търсите.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв е ефикасен начин да направите И/ИЛИ Търсене в приложението Django-Postgres?

  2. Генерирайте SQL за актуализиране на първичен ключ

  3. Как да създадете постоянни файлове на Heroku?

  4. Мета команди в Psycopg2 - \d не работят

  5. Как да получите заявка за атрибути на колона от името на таблицата с помощта на PostgreSQL?