Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#1 lun. 20 mars 2017 08:57

bruhnild
Membre
Lieu: Lyon
Date d'inscription: 7 juin 2014
Messages: 27

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 !


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 lun. 20 mars 2017 09:33

guil31
Membre
Date d'inscription: 22 janv. 2013
Messages: 67

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 lun. 20 mars 2017 09:53

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 982

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 mar. 21 mars 2017 09:05

bruhnild
Membre
Lieu: Lyon
Date d'inscription: 7 juin 2014
Messages: 27

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!


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#5 mar. 21 mars 2017 09:34

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 982

Re: Tableau de valeurs croisées [Postgres SQL]

Un petit filtre where chambre is not null et hop wink

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB

Partagez  |