Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/09/2011, 15h36   #1
Membre du Club
 
Inscription : janvier 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 134
Points : 47
Points : 47
Par défaut [SQL2008][SQL] : Reponse synthetique et complete par document

Bonjour,

Le titre est bizarre mais je n'ai pas trouvé mieux.

Mon besoin :
J'ai une base d'information avec des documents. Chaque document à un certain nombre de paramètres fixes et d'autres facultatifs.

Les attributs fixes sont stockés dans la table document
Les attributs facultatifs sont stockés dans une table séparée avec un lien (ID du doc) comme jointure.

Donc Tab_Doc à pour colonne ID_DOC ; Reference ; Titre ; Date de création
ex : 1 ; REF_1 ; Doc_1 ; 12/09/11
2 ; REF_2 ; Doc_2 ; 13/09/11

et Tab_Facultatif à pour colonne ID_DOC ; Libellé paramétre ; Valeur.
ex : 1 ; Validé ; Oui
1 ; Emetteur ; Toto
1 ; Service ; Service_1
2 ; Validé ; Non
2 ; Emetteur ; Titi

Je souhaite créer une requête pouvant me retourner les informations suivantes :
1 ; REF_1 ; Doc_1 ; 12/09/11 ; Oui ; Toto ; Service 1
2 ; REF_2 ; Doc_2 ; 13/09/11 ; Non ; Titi ;

Est ce possible en SQL ? Sinon en procédure stockée ?

Et si oui, comment ?

D'avance merci pour vos retours car là je séche complètement.

Bonne journée (ou soirée).

A+



1 ; REF_1 ; Doc_1 ; 12/09/11 ; Validé
basto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 15h58   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 958
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 958
Points : 17 789
Points : 17 789
Intéressez vous à ce sujet : http://sqlpro.developpez.com/cours/m...n/metadonnees/

Les requêtes sont généralement de la forme :

Code :
1
2
3
4
5
6
7
8
9
SELECT T.DOC_ID
FROM   MaTablePrimaire AS T
       INNER JOIN MatableMeta AS M
             ON T.??? = M.???
WHERE  PARAM_LIB IN (...)
  AND  PARAM_VAL IN (...)
GROUP  BY T.DOC_ID
HAVING COUNT(DISTINCT PARAM_LIB) = COUNT(PARAM_VAL)
  AND  COUNT(DISTINCT PARAM_LIB) = n -- n étant le nombre de couple LIB/VAL
A +

PS : la prochaine fois respectez la charte de postage : http://www.developpez.net/forums/d96...vement-poster/
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 16h06   #3
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Oui, c'est possible.

Le plus "simple", c'est de faire N jointures sur la table des attributs facultatifs, avec un OUTER JOIN à chaque fois.

Code :
1
2
3
4
5
6
 
SELECT doc.id_doc, doc.reference, doc.titre, doc.datecre, p1.valeur validie, p2.valeur emetteur, p3.valeur service
FROM Tab_Doc doc
LEFT OUTER JOIN Tab_Facultatif p1 ON p1.id_doc = doc.id_doc AND p1.libelle = 'Validé'
LEFT OUTER JOIN Tab_Facultatif p1 ON p2.id_doc = doc.id_doc AND p1.libelle = 'Emetteur'
LEFT OUTER JOIN Tab_Facultatif p1 ON p3.id_doc = doc.id_doc AND p1.libelle = 'Service'
Il faudra rajouter une jointure par propriété.

Vous pouvez aussi utiliser une fonction de pivot, mais je ne sais plus si SQL Server 2008 en supporte une nativement. Dans tous les cas, vous comprendrez qu'il vaut mieux faire une unique jointure inner join, récupérer deux colonnes "libellé paramètre" et "valeur paramètre", et faire le pivot dans votre application cliente.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 16h47   #4
Membre du Club
 
Inscription : janvier 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 134
Points : 47
Points : 47
Bonjour

Désolé pour le format de ma demande mais c'est la première fois que j'utilise ce site pour la partie base de données.

Par contre, pour ce qui concerne le FAQ, c'est bien quand on sait ce que l'on cherche. Et là, mon souci était que je ne savais que choisir.

En tout cas merci pour ces 2 retours que je vais mettre en application.

A+
basto est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h55.


 
 
 
 
Partenaires

Hébergement Web