2017-09-12 4 views
0

J'ai des données telles que les suivantes:Postgresql crosstab valeur pivot existe dans la colonne pour le nom de la ligne

create temp table codes (id integer, code text); 
insert into codes (id, code) values 
    (1, 'code_1'), 
    (1, 'code_2'), 
    (2, 'code_2'), 
    (3, 'code_1'); 

Afin de faciliter une sélection qui rejoint sur le champ id, je voudrais faire pivoter ce tableau à l'aide du tableau croisé , de sorte que chaque valeur d'identifiant est unique. Jusqu'à présent, j'ai cette conception, qui travaille pour une valeur de code unique:

select * 
from crosstab($$ 
    select id, code, case when code = 'code_1' then true else false end 
    from codes 
    order by 1,2 
$$) as codes(id int, is_code_1 boolean); 

sortie correcte:

id | is_code_1 
----+----------- 
    1 | t 
    2 | f 
    3 | t 
(3 rows) 

Je voudrais pouvoir l'étendre aux valeurs de code multiples pour que je finis avec sortie comme ceci:

id | is_code_1 | is_code_2 
----+-----------+----------- 
    1 | t   | t 
    2 | f   | t 
    3 | t   | f 

Pas sûr que ce soit possible, mais serait très heureux d'apprendre autrement.

Modifier: Cela me permet d'être très proche du résultat souhaité, peut fournir comme une réponse, car je peux l'utiliser pour résoudre le problème. Merci @Daniel Vérité pour le lien vers un tableau croisé de 2 paramètres.

select * 
from crosstab(
    $$ 
    select id, code, case when code is not null then true else false end 
    from codes 
    order by 1,2 
    $$, 
    $$values ('code_1'), ('code_2')$$ 
) as codes(id int, code_1 boolean, code_2 boolean); 

Produit:

id | code_1 | code_2 
----+--------+-------- 
    1 | t  | t 
    2 |  | t 
    3 | t  | 

donc au lieu de valeurs nulls faux booléennes, mais je peux travailler avec ça.

+1

Essayez avec 2 paramètres crosstab, comme expliqué dans https://stackoverflow.com/questions/3002499/postgresql- crosstab-query –

+0

@ DanielVérité Merci pour le lien, ça m'a fait 99% du chemin. – sage88

Répondre

0

Je ne sais pas si je vous ai bien compris, mais ce code peut répondre à votre question:

select * 
    from crosstab($$ 
    select id, code, case when code = 'code_1' then true 
          when code = 'code_2' then true else false end 
    from codes 
    order by 1,2 
$$) as codes(id int, is_code_1 boolean, is_code_2 boolean); 
+0

Ceci ne produit pas le résultat souhaité affiché ci-dessus. – sage88