PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pivot di Postgresql dengan tanda TRUE/FALSE

Saya bereksperimen sedikit dan inilah yang saya dapatkan.

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

Jika Anda tidak peduli dengan urutan kolom, Anda bisa melakukan SELECT DISTINCT * ...

Mengganti NULL s dengan FALSE mungkin akan sedikit sulit mengingat 350 tag yang Anda katakan Anda miliki. Jadi saya sarankan untuk meninggalkan mereka. Jika Anda menginginkannya, Anda dapat melakukan SELECT DISTINCT date, id, species, illness, COALESCE(mucus, 'FALSE'), COALESCE(noisy, 'FALSE'),...

Namun pil pahit yang harus Anda telan adalah menetapkan 350 tag sebagai kolom dengan jenis text dalam as the tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text) -bagian dari pernyataan tab silang. Pastikan untuk mengurutkannya dengan benar seperti yang ditentukan oleh 'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1' juga dalam pernyataan tab silang.

Semoga itu yang Anda cari.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Penyatuan Koneksi PostgreSQL dengan PgBouncer

  2. MENGEMBALIKAN data dari tampilan yang dapat diperbarui tidak berfungsi?

  3. Gunakan nilai baris sebagai kolom di PostgreSQL

  4. Postgres SELECT di mana WHERE adalah UUID atau string

  5. Metode otentikasi PostgreSQL 10 tidak didukung