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 Fri 02 February 2018 11:39

Elys
Participant actif
Date d'inscription: 1 Mar 2016
Messages: 54

PostGis jointure ligne - colonne

bonjour à tous,

je fais appel à vous car je suis un peu perdu pour une requete SQL.

J'ai deux table : "parcelle" qui est géométrique et représente des parcelles
                        "valeur" n'a pas de géométrie et qui est un tableau de valeurs à attribuer à "parcelle" en fonction de plusieurs paramètres.

Mes tables ont deux champs communs : a et b. En plus de sa "parcelle" a un champ c qui correspond aux titre des colonnes de "valeur".


J’essaie de faire une requête qui attribuera à chaque parcelle une valeur en fonction des champs a, b et c :

Code:

select pkey, surf_ha, commune, a, b, c, 01 from parcelle  ## ici le 01 correspond à une colonne de la table valeur 
full outer join valeur
on parcelle.a = valeur.a and parcelle.b = valeur.b
where c = '01'
group by pkey, 01,                                                                    ## ici le 01 correspond à une colonne de la table valeur
ORDER BY pkey

J'ai la deux problèmes:

1) c'est assez long, en effet c peut prendre 18 valeurs différentes (qui correspondent à 18 colonnes de la table valeur). Et j'ai 16 scénarios a étudier. J'aimerai donc faire toutes les valeurs de c en une fois si possible.

2) certaines parcelles réapparaissent plusieurs fois : j'obtiens 405 lignes alors que dans qgis, lorsque je séléctionne mes parcelles avec c = '01' j'ai 366 lignes.



je suis preneur de toutes vos bonnes idées.

merci d'avance :)

Dernière modification par Elys (Fri 02 February 2018 11:58)

Hors ligne

 

#2 Fri 02 February 2018 11:58

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3197
Site web

Re: PostGis jointure ligne - colonne

Bonjour,

C'est pas très clair tout cela.
Pourquoi un FULL OUTER JOIN ?

Le couple de valeur a,b pour un enregistrement est-il une paire unique ? Ou formuler autrement existe il des enregistrement où :
parcelle.a=a1
parcelle.b=b1
valeur.a=a1
parcelle.b=b2
??

Et à quoi sert pkey ? (car une clef primaire c'est bien mais c'est aussi utile dans les jointures).


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#3 Fri 02 February 2018 12:56

Elys
Participant actif
Date d'inscription: 1 Mar 2016
Messages: 54

Re: PostGis jointure ligne - colonne

Bonjour et merci,

désolé, j'avais un peu modifié mon poste de base en même temps que vous deviez répondre.

Pour le full outer join, j'ai repris une autre requête qui utilisait cette jointure. Mais mon résultat est le même avec un join tout simple.

la pkey (unique pour une parcelle), je l'ai surtout ajoutée pour voir quelles parcelles posaient probleme et ressortaient plusieurs fois.

une seule parcelle ne peut avoir qu'un couple de valeurs a,b et un seul triplet de valeurs abc correspondant a une case valeur de la table valeur.

Hors ligne

 

#4 Fri 02 February 2018 14:12

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3197
Site web

Re: PostGis jointure ligne - colonne

Bonjour,

Regardez la doc de FULL OUTER JOIN, vous constaterez que le jeux de résultats est volumineux.
Faire ce type de jointure c'est comme si vous faisiez un LEFT JOIN UNION RIGHT JOIN.

D'où le temps d’exécution et les parcelles en double.

une seule parcelle ne peut avoir qu'un couple de valeurs a,b et un seul triplet de valeurs abc correspondant a une case valeur de la table valeur.


Donc c'est une relation 1 à 1 entre vos deux tables, il existe deux façons de l'écrire:

Code:

SELECT * FROM parcelle as p INNER JOIN valeur as v ON (p.a=v.a AND v.b=p.b AND p.c=v.c)

ou

Code:

SELECT * FROM parcelle as p,valeur as v WHERE p.a=v.a AND v.b=p.b AND p.c=v.c

Dernière modification par ChristopheV (Fri 02 February 2018 14:13)


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#5 Fri 02 February 2018 15:39

Elys
Participant actif
Date d'inscription: 1 Mar 2016
Messages: 54

Re: PostGis jointure ligne - colonne

En fait je me suis mal exprimé, 

chaque parcelle ne peut avoir qu'une valeur de couple ab qui peut prendre différentes valeurs en fonction de son attribut c (ces valeurs sont stockées dans la table valeurs dans des colonnes "cout1", "cout2", ..., "cout18").

Peut-être que mon probleme sera plus clair si j' explique mon cheminement sous Qgis pour arriver au résultat attendu :

1) J'ai concaténer les valeurs des champ a et b de ma couches parcelle et ma table valeur dans une colonne ab.

2) J'ai joint ma table valeur à ma couche parcelle par le champ ab. J'obtient une table avec toutes les valeurs que  peut prendre chaque parcelle en fonction de c, mais une seule est la bonne

3) Ensuite dans la table parcelle j'ai calculé ma colonne "valeur" dans par une formule :

CASE
WHEN "c" = 1 then "valeur1"
When "c" = 2 then "valeur2"
...
when "c" = 18 then "valeur18"
end



Merci encore pour vos coups de main smile

Hors ligne

 

#6 Fri 02 February 2018 23:49

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1159

Re: PostGis jointure ligne - colonne

Salut,

Christophe a raison, vous n'avez pas vraiment besoin d'un FULL OUTER JOIN.

Voici ce que je propose :

Code:

SELECT *
FROM
parcelle
JOIN (
    SELECT a,b, col_val, c 
    FROM valeur, 
    LATERAL ROWS FROM (
        unnest(ARRAY["01", "02", ...,"18"]), 
        unnest(ARRAY['01', '02', ..., '18'])) foo(col_val, c)
) val
USING (a,b,c)

L'idée est de créer une table à partir de chaque quadruplet
formé par les colonnes a et b et chaque couple nom de colonne / colonne
de la table valeur, et ce pour chacune de ses lignes,
pour pouvoir la joindre a la table parcelle.

On utilise pour se faire la fonctions d'ensemble unnest
qui tranforme un tableau en "table".
On constitue deux tableaux, un contenant le nom des colonnes,
,un autre contenant les valeurs,
et on utilise la syntaxe LATERAL ROWS FROM (...) pour s'assurer
que les deux "tables" renvoyées par les fonctions ne resulte pas en
un produit cartésien mais se "juxtaposent".

Dernière modification par tumasgiu (Sat 03 February 2018 10:17)

Hors ligne

 

Pied de page des forums

Powered by FluxBB