sql >> Databáze >  >> RDS >> PostgreSQL

Pivot v Postgresql s označením TRUE/FALSE

Trochu jsem experimentoval a přišel jsem na tohle.

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

Pokud vám nezáleží na pořadí sloupců, stačí udělat SELECT DISTINCT * ...

Nahrazení NULL s FALSE bude pravděpodobně trochu obtížné vzhledem k 350 tagům, které říkáte, že máte. Takže doporučuji nechat je pryč. Pokud je chcete, můžete udělat SELECT DISTINCT date, id, species, illness, COALESCE(mucus, 'FALSE'), COALESCE(noisy, 'FALSE'),...

Hořkou pilulku, kterou však budete muset spolknout, je zadat všech 350 značek jako sloupec s typem text v as the tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text) -část příkazu kontingenční tabulky. Ujistěte se, že jste je seřadili ve správném pořadí podle 'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1' také v kontingenčním příkazu.

Doufám, že to je to, co jste hledali.



  1. WAMP a mysqli::real_connect():(HY000/2002)?

  2. Jak používat klauzuli HAVING v SQL

  3. Jak zkopírovat data z jedné tabulky do jiné nové tabulky v MySQL?

  4. Mysqli_error() nefunguje