PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 08/08/2016 10:17:17

c che
Membre

vues:remplir 2 champs avecla même colonne etdes conditions différentes

Bonjour,


J'ai :


-une table gestion (ges_id, ges_nom)
-une table objet (obj_id, obj_nom)
-une table gestion_objet (geob_ges_id, geob_obj_id, geob_date_debut, geob_date_fin) qui lie les deux tables précédentes entre elles


Je souhaite créer une vue qui contient un champ gestion et un champ ex_gestion qui vont tous les deux puiser l'information dans ges_nom. la différence entre ex_gestion et gestion est que le premier à une date de fin remplit alors que l'autre non. Comment puis-je paramétrer la vue pour que ex_gestion et gestion contiennent les bons gestionnaires ?


Pour l'instant j'ai :


SELECT obj_id, obj_nom, ges_nom AS gestion, ges_nom AS ex_gestion
FROM objet, gestion_objet, gestion
WHERE (obj_id=geob_obj_id) AND (ges_id=geob_ges_id) AND
CASE gestion WHEN(trge_date_fin >0) THEN Ex_GESTION=gestion.ges_nom    WHEN(trge_date_fin =0) THEN GESTION=gestion.ges_nom
WHEN trge_date_fin IS NULL THEN GESTION=gestion.ges_nom
END;


Bien évidemment cette technique ne fonctionne pas, comment dois-je m'y prendre?


Je n'ai pas trouvé de solutions sur internet mais peut être n'ai-je pas les bons mots clés.


Merci d'avance pour vos réponses,


c.che


PS: J'ai la version 2.0 de Postgis, 9.5.3 de Postgres et 2.14.1 de Qgis

PPS: J'espère avoir été suffisamment précise mais n'hésitez pas à me faire signe si ce n'est pas le cas

Dernière modification par c che (08/08/2016 10:17:45)

Hors ligne

#2 08/08/2016 10:50:45

rjuju
Administrateur

Re : vues:remplir 2 champs avecla même colonne etdes conditions différentes

Votre demande n'est pas très claire pour moi.  Si j'ai bien compris, votre demande suppose qu'il y a au maximum 2 enregistrements (si la définition de gestionnaire est la jointure entre gestion_objet et gestion) présents pour un objet dans gestion_objet. Si cette contrainte n'est pas présente sur le modèle de données, vous aurez un problème tôt ou tard (sauf si je n'ai pas compris votre demande).

Hors ligne

#3 08/08/2016 14:27:41

c che
Membre

Re : vues:remplir 2 champs avecla même colonne etdes conditions différentes

Dans mon MCD, la relation entre ma table "objet" et ma table "gestion" est 1,N/0,N la table "gestion_objet" est la table qui résulte de l'association entre les 2.


Cette table a comme clés primaires/étrangères les id de la table "objet"(qui contient toutes les données de l'objet) et de la table "gestion"(qui contient uniquement les noms des différents gestionnaires possibles) plus un champ date de début et un champ date de fin de la gestion.


S'il y a une date de fin pour une entrée dans la table "gestion_objet" alors cette entrée dois être visible uniquement dans le champ EX_GESTION de ma vue, si ce n'est pas le cas alors il doit être visible uniquement dans le champ GESTION de ma vue.


Est-ce possible dans cette configuration ou bien faut-il que je fasse autrement?


C.che

Dernière modification par c che (08/08/2016 14:30:33)

Hors ligne

#4 08/08/2016 16:29:55

rjuju
Administrateur

Re : vues:remplir 2 champs avecla même colonne etdes conditions différentes

Ah d'accord. Pourquoi ne pas mettre le CASE .. END dans le select ?

SELECT ..., CASE WHEN geob_date_fin IS NULL THEN ges_nom ELSE NULL END AS gestion, CASE WHEN geob_date_fin IS NULL THEN NULL ELSE ges_nom END AS ex_gestion
FROM...

(ou quelque chose du genre)

Hors ligne

#5 08/08/2016 17:05:38

c che
Membre

Re : vues:remplir 2 champs avecla même colonne etdes conditions différentes

Cette technique marche très bien (je viens de la tester smile)  . Mon seul problème maintenant c'est qu'elle duplique l'objet dans ma vue.


Pour être plus claire, j'ai une ligne obj1 avec le gestionnaire et une ligne obj1 avec l'ex_gestionnaire. Faut-il modifier les case when pour avoir une seule entrée obj1 avec gestion et ex_gestion sur la même ligne?
Dans ma table" gestion_objet" j'ai :
geob_obj_id;geob_ges_id;geob_date_debut;geob_date_fin
1;1;2010-10-10;null                             (→ gestionnaire actuel)
1;2;1974-10-10;2010-10-10                  (→ancien gestionnaire)


Ce que je souhaite obtenir dans ma vue :

obj_id; obj_gestionnaire; obj ex_gestionnaire
1; syndicat1 ; commune2


(Désolée si ma question parait toute bête mais je débute en SQL)


En tout cas merci pour ta réponse rapide et efficace (thumbs up), elle me fait faire un bon en avant smile

Dernière modification par c che (08/08/2016 17:42:42)

Hors ligne

#6 08/08/2016 21:48:12

rjuju
Administrateur

Re : vues:remplir 2 champs avecla même colonne etdes conditions différentes

C'est lié problème que je soulevais au dessus. Votre vue pourra marcher tant qu'il y aura au plus deux gestionnaires pour un même objet.  Comment doit se comporter votre requête s'il y a un historique de 5 ou 6 gestionnaires ?

Hors ligne

#7 09/08/2016 09:06:53

c che
Membre

Re : vues:remplir 2 champs avecla même colonne etdes conditions différentes

On a pas à historiser autant de gestionnaire, on a juste besoin d'avoir 1 seul gestionnaire et 1 seul ex_gestionnaire.
Du coup est-ce possible? et si oui, comment faire?

Dernière modification par c che (09/08/2016 11:26:22)

Hors ligne

#8 16/08/2016 09:37:11

c che
Membre

Re : vues:remplir 2 champs avecla même colonne etdes conditions différentes

Dois-je passer par une fonction pour avoir les 2 informations dans un seul enregistrement ?

Hors ligne

#9 16/08/2016 09:54:35

rjuju
Administrateur

Re : vues:remplir 2 champs avecla même colonne etdes conditions différentes

On a pas à historiser autant de gestionnaire, on a juste besoin d'avoir 1 seul gestionnaire et 1 seul ex_gestionnaire.

Est-ce qu'une contrainte empêche l'insertion de plus de deux gestionnaires, ou c'est juste « censé ne pas arriver ».  Dans le second cas, le problème arrivera un jour ou l'autre.

Hors ligne

#10 16/08/2016 14:15:03

c che
Membre

Re : vues:remplir 2 champs avecla même colonne etdes conditions différentes

" Est-ce qu'une contrainte empêche l'insertion de plus de deux gestionnaires"


Non, il n'y a pas de contraintes particulières


"Dans le second cas, le problème arrivera un jour ou l'autre."


Non, ça ne devrait pas arriver car on a choisi d'historiser uniquement l'ex_gestionnaire le plus récent.

Dernière modification par c che (16/08/2016 16:35:48)

Hors ligne

#11 16/08/2016 15:33:30

rjuju
Administrateur

Re : vues:remplir 2 champs avecla même colonne etdes conditions différentes

Ok. Cette requête devrait fonctionner

SELECT geob_obj_id, min(cur.ges_nom) AS gestion, min(ex.ges_nom) AS ex_gestion
FROM gestion_objet ob
LEFT JOIN gestion ex ON ex.ges_id = ob.geob_ges_id AND geob_date_fin IS NOT NULL
LEFT JOIN gestion cur ON cur.ges_id = ob.geob_ges_id AND geob_date_fin IS NULL
GROUP BY geob_obj_id;

Hors ligne

#12 16/08/2016 16:35:04

c che
Membre

Re : vues:remplir 2 champs avecla même colonne etdes conditions différentes

Ça fonctionne à la perfection. Merci beaucoup smile


J'ai juste une petite question concernant la compréhension du code

A quoi correspondent cur. et ex. 
Est-ce que ce sont des fonctions ou bien des alias?

Hors ligne

#13 16/08/2016 16:39:09

rjuju
Administrateur

Re : vues:remplir 2 champs avecla même colonne etdes conditions différentes

Ce sont des alias.

Hors ligne

Pied de page des forums