#1 Mon 20 March 2017 08:57
- bruhnild
- Participant actif
- Lieu: Lyon
- Date d'inscription: 7 Jun 2014
- Messages: 130
Tableau de valeurs croisées [Postgres SQL]
Bonjour,
Je me tourne vers vous car je suis bloquée depuis deux jours pour réaliser un croisement de valeurs dans ma table postgres sql.
Je m’explique, je pars de cette table (voir première capture de la pj) cherche à obtenir cette table en résultat (voir deuxième capture de la pj)
Soit N+2 notre chambre a (origine), N+3 notre chambre b (destination).
N+3 devient à son tour chambre a (origine), N+4 chambre b (destination). Ect…
J'espère être clair dans mes explications...
Sauriez-vous arriver à me débloquer sur cette manipulation postgres sql ?
Merci d’avance !
Hors ligne
#2 Mon 20 March 2017 09:33
- guil31
- Participant actif
- Date d'inscription: 22 Jan 2013
- Messages: 79
Re: Tableau de valeurs croisées [Postgres SQL]
Bonjour,
Si le nombre de colonnes est connu à l'avance:
Code:
select * from ( select "n+2" as chambre_a, "n+3" as chambre_b from ma_table UNION ALL select "n+3" as chambre_a, "n+4" as chambre_b from ma_table UNION ALL select "n+4" as chambre_a, "n+5" as chambre_b from ma_table ..... Ect ) as Sel where chambre_a is not null and chambre_b is not null
Claire
Hors ligne
#3 Mon 20 March 2017 09:53
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Tableau de valeurs croisées [Postgres SQL]
Bonjour,
Une solution pour passer de colonnes en lignes et de lignes en colonnes avec PG est d'utiliser des tableaux (et des self join)
Dans votre cas par ex, en considérant que votre table a une colonne PK permettant d'ordonner les lignes, et en décomposant en étapes:
Code:
with tmp as ( select * from (values (1,16,14,543,554), (2,16,14,543,560), (3,16,14,15,null), (4,16,14,15,null), (5,16,14, null, null)) as t (id,n2,n3,n4,n5) ), tmp1 as ( SELECT id, unnest(ARRAY [n2, n3, n4, n5]) AS ch FROM tmp ORDER BY id ), tmp2 as ( SELECT t.*, row_number() OVER () AS rn FROM tmp1 t ) select t1.ch as chambrea, t2.ch as chambreb from tmp2 t1, tmp2 t2 where t2.rn = t1.rn + 1 and t1.id = t2.id;
ce qui donne:
Code:
chambrea chambreb 16 14 14 543 543 554 16 14 14 543 543 560 16 14 14 15 15 null 16 14 14 15 15 null 16 14 14 null null null
On collecte les colonnes dans un tableau, puis on remet en lignes (unnest) et on self-join pour matérialiser les deux colonnes chambrea et chambreb cote à cote.
Par contre, au niveau modèle, c'est bien pertinent d'avoir en colonnes les n chambres ?
Nicolas
Hors ligne
#4 Tue 21 March 2017 09:05
- bruhnild
- Participant actif
- Lieu: Lyon
- Date d'inscription: 7 Jun 2014
- Messages: 130
Re: Tableau de valeurs croisées [Postgres SQL]
Merci guil31, la requête fonctionne et répond bien à mon besoin.
Nicolas Ribot, la requête fonctionne également mais tel que je dois obtenir mon résultat, il ne devrait pas y avoir de valeur null dans mes colonnes chambrea et chambreb. C'est à dire que la dernière valeur correspond à la chambre b (14 chambrea->15 chambreb ou encore 16 chambrea->14 chambreb). Ci joint une capture pour expliquer.
Merci à tous les deux, et bonne journée!
Hors ligne
#5 Tue 21 March 2017 09:34
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Tableau de valeurs croisées [Postgres SQL]
Un petit filtre where chambre is not null et hop
Nicolas
Hors ligne