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 !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

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


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

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!


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

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 wink

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB