djobert
Messages postés4Date d'inscriptionlundi 1 décembre 2008StatutMembreDernière intervention 9 janvier 2009
-
1 déc. 2008 à 15:00
djobert
Messages postés4Date d'inscriptionlundi 1 décembre 2008StatutMembreDernière intervention 9 janvier 2009
-
2 déc. 2008 à 17:11
Salut, j’ai un problème SQL que je n'arrive pas à résoudre.
<?XML:NAMESPACE PREFIX = O /??>
J’ai une table contenant les informations de plans numérisés avec plusieurs colonnes remplies de valeurs codées.
Je me suis créé une vue qui contient les informations de ma table, avec toutes les valeurs codées remplacées par leurs valeurs vraies se trouvant dans les tables autour.
Dans une de mes tables à coté de la principale, j’ai 2 colonnes : une qui contient le numéro de plan (c’est la colonne que j’utilise pour faire le join avec la table principale), et l’autre qui contient le secteur dans lequel se trouve le plan.
Le problème, c’est que certains plans touchent à plusieurs secteurs. Le logiciel qui est utilisé pour saisir les fiches des plans va aller créer plusieurs enregistrements. Par exemple, si j’ai le plan 0075 qui touche aux secteurs CAP, TR et TRO, je vais avoir dans ma table 3 enregistrements
0075 | CAP
0075 | TR
0075 | TRO
Cela fait que dans la vue, une fois le join créé, dans ma liste de plans, lorsque j’arrive au 0075, dans la colonne secteur, j’aurai une seule valeur contenue, par exemple CAP.
Cela fait que je perds les 2 autres valeurs. Ca donne quelque chose du genre :
Table secteur VUE
NO_PLAN NO_SECTEUR NO_PLAN SECTEUR
0074 TR 0074 TR
0075 CAP 0075 CAP
0075 TR 0076 TRO
0075 TRO
0076 TRO
Je cherche donc un moyen pour que dans ma vue, dans la colonne secteur, je puisse avoir plusieurs valeurs. J’ai pensé faire une fonction Concaténer, mais cela fonctionne bien lorsque je veux rassembler les données de plusieurs colonnes en une seule.
Dans mon cas, je veux rassembler plusieurs champs d’une même colonne dans un seul champ pour que ca donne quelque chose du genre
Table secteur VUE
NO_PLAN NO_SECTEUR NO_PLAN SECTEUR
0074 TR 0074 TR
0075 CAP 0075 CAP – TR – TRO
0075 TR 0076 TRO
0075 TRO
0076 TRO
Alors, y a-t-il une façon, dans ma requête SQL, pour faire un genre de contaténer de plusieurs champs, qui ont une valeur commune, à l’intérieur d’un seul champ dans la vue?
Merci
-djobert-
A voir également:
Sql server concaténer plusieurs lignes dans un seul champ
djobert
Messages postés4Date d'inscriptionlundi 1 décembre 2008StatutMembreDernière intervention 9 janvier 2009 2 déc. 2008 à 17:11
Présentement, je perd les enregistrements un peu par exprès. Le problème est justement là, je ne dois pas avoir d'information qui s'ajoute. Je vais te faire un topo rapide.
SELECT Plans_1.NO_PLAN, Plans_1.date_numerisation, Plans_1.no_projet_ref, Plans_1.titre, Plans_1.sous_titre, Plans_1.plan_prepare_par,
Plans_1.date_plan, Plans_1.date_inconnue, Plans_1.date_approx, Plans_1.echelle_h_ingenierie, Plans_1.echelle_h_metrique,
Plans_1.echelle_h_ratio, Plans_1.echelle_v_ingenierie, Plans_1.echelle_v_metrique, Plans_1.echelle_v_ratio, Plans_1.commentaires,
Plans_1.no_plan_voute, Types_1.nom_type, Unite_1.nom_unite, Medias_1.nom_media, Etats_1.nom_etat, Categorie_1.nom_categorie,
Emissions_1.nom_emission, Ratios_1.nom_ratio, PlanSecteur_1.secteur
FROM swhvsql01.ServicesTechniques.dbo.Categorie_type AS Categorie_1 RIGHT OUTER JOIN
swhvsql01.ServicesTechniques.dbo.Types AS Types_1 ON Categorie_1.NO_CATEGORIE_TYPE = Types_1.no_categorie RIGHT OUTER JOIN
swhvsql01.ServicesTechniques.dbo.Plans AS Plans_1 ON Types_1.NO_TYPE = Plans_1.no_type LEFT OUTER JOIN
swhvsql01.ServicesTechniques.dbo.Unite_mesure AS Unite_1 ON Plans_1.echelle_unite = Unite_1.NO_UNITE LEFT OUTER JOIN
swhvsql01.ServicesTechniques.dbo.Medias AS Medias_1 ON Plans_1.no_media = Medias_1.NO_MEDIA LEFT OUTER JOIN
swhvsql01.ServicesTechniques.dbo.Emissions AS Emissions_1 ON Plans_1.no_emission = Emissions_1.NO_EMISSION LEFT OUTER JOIN
swhvsql01.ServicesTechniques.dbo.Etats AS Etats_1 ON Plans_1.no_etat = Etats_1.NO_ETAT LEFT OUTER JOIN
swhvsql01.ServicesTechniques.dbo.Ratios AS Ratios_1 ON Plans_1.echelle_h_no_ratio = Ratios_1.NO_RATIO LEFT OUTER JOIN
swhvsql01.ServicesTechniques.dbo.PlanSecteur AS PlanSecteur_1 ON Plans_1.NO_PLAN = PlanSecteur_1.NO_PLAN
Voila ma super requête. J'ai la table Plans qui contient toutes mes informations sous formes de valeurs codées, et j'ai toutes les autres tables autour qui contiennent les vraies valeurs. J'ai donc créé ma vue pour obtenir la table Plans avec les valeurs codées remplacées par les vraies valeurs.
Dans ma table Plans, j'ai la colonne NO_PLAN, qui contient les numéros identifiants des plans. Chaque numéro doit être unique. Le problème se situe au niveau du join pour le secteur. Présentement, le join pointe vers la table PlanSecteur, mais c'est une table de remplacement, c'est pour celà que je perd mes enregistrements. Normalement, je pointe vers une table qui s'appel Secteur. Un même plan peut couvrir plusieurs secteurs. Donc, dans la table Secteur, j'aurai, comme dans mon exemple, 3 enregistrements qui contiennent le même NO_PLAN, avec 3 Secteurs différents. Si je fais mon join vers cette table en utilisant le NO_PLAN comme champ commun, dans ma vue, je me trouve maintenant avec 3 enregistrements qui ont le même NO_PLAN et des secteurs différents. Cela ne respecte pas le but de la vue qui est d'avoir 1 seul enregistrement par NO_PLAN.
De là provient mon besoin de prendre les 3 enregistrements de la table Secteur qui ont un NO_PLAN identique, et d'aller regrouper les 3 secteurs dans le champ secteur de l'enregistrement unique dans ma vue., pour ne pas avoir d'enregistrements ajoutés et de NO_PLANS dupliqués.