sql >> データベース >  >> RDS >> PostgreSQL

TRUE/FALSEマーキングを使用したPostgresqlでのピボット

    私は少し実験しました、そしてこれは私が思いついたものです。

    # 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. postgresqlnextvalは既存の値を生成します

    2. pdo無料結果

    3. IXロックがInnoDBの別のIXロックと互換性があるのはなぜですか?

    4. MYSQLERROR1045でアクセスが拒否されました