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/07/2011, 18h22   #1
Invité de passage
 
Homme
Inscription : juillet 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 3
Points : 0
Points : 0
Par défaut Req SQL sans doublons

Bonjour Tout le monde,

J'ai 3 tables (Demandes, Caractéristique et Valeur_Caractéristique) , chaque demande possède 0, 1 ou 2 caractéristiques, Ma question c'est comment peut on faire pour lister toutes les demandes avec leur caractéristique (valeur_caractéristique) sans avoir des doublons, c-a-d dans le cas ou j'ai 2 caractéristiques j'affiche seulement une.

Ci-après un exemple du résultat de la requête que j'ai fait Exp :

11001 Installation
11001 Conforme
11002 000000000
11003 Configuration
11003 Conforme

Merci pour votre aide
ahmedbassou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 23h36   #2
Membre éprouvé
 
Homme Hamid MIRA
Ingénieur développement logiciels
Inscription : septembre 2003
Messages : 177
Détails du profil
Informations personnelles :
Nom : Homme Hamid MIRA
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2003
Messages : 177
Points : 413
Points : 413
Ton message n'est pas du tout clair.
Peux-tu :
- Reformuler ta question en étant plus précis,
- Fournir les scripts de création des 3 tables,
- Fournir également des exemples de jeux de données illustrant ce que tu veux obtenir comme résultat.
Citation:
Envoyé par ahmedbassou Voir le message
... c-a-d dans le cas ou j'ai 2 caractéristiques j'affiche seulement une.
Laquelle des 2 caractéristique veux-tu afficher ? la caractéristique la plus récente, la plus ancienne, celle ayant la plus petite valeur, la plus grande valeur, etc. Sachant que :
Citation:
une demande possède 0, 1 ou 2 caractéristiques
A+
__________________
"Une idée mal écrite est une idée fausse !"
hmira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 08h58   #3
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Tu veux la liste des demandes possédant au moins une caractéristique?

Si c'est le cas ne passe pas par un JOIN mais par un EXISTS:

Code :
1
2
3
4
5
6
 
SELECT col1 
FROM DEMANDE D 
WHERE EXISTS(SELECT * 
                     FROM CARACTERISTIQUE C
                     WHERE C.IDDEMANDE=D.IDDEMANDE)
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 14h51   #4
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Par défaut fonctions de classement

Bonjour,

En effet, il faudrait avoir un peu plus de précisions, notamment sur la caractéristique que vous souhaitez garder à afficher.

Je vous conseille cependant de regarder du coté des fonctions de classement, notamment ici : http://msdn.microsoft.com/fr-fr/library/ms189461.aspx .
En utilisant ces fonctions, notamment avec ROW_NUMBER, vous devriez pouvoir limiter l'affichage à une seule caractéristique par demande.

Bon courage
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 15h26   #5
Invité de passage
 
Homme
Inscription : juillet 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 3
Points : 0
Points : 0
Par défaut Reformulation demande

Bonjour Je vous remercie pour l’intérêt que vous avez données à ma demande, bon je reformule mon besoin avec des exp:

J'ai une table demande qui a la structure suivante

Citation:
N°Dmd Demandeur ID_NAt RcvDte
-------------------------------------------------------
2000 JPC AUDIT 17 2010-11-25 09:46:00.000
2011 JPC AUDIT 15 2010-11-26 09:51:00.000
2012 JPC AUDIT 16 2010-12-06 15:13:00.000
2013 JPC AUDIT 15 2010-12-06 16:20:00.000
2014 JPC AUDIT 18 2010-12-06 16:25:00.000

Table ValCaractéristique (caractéristique de la demande) :

ID_ValC N° Dmd IDCar ValCar
------------------------------------------------
4178 2011 69 Installation/affectation
4179 2011 49 00000000000000000
4180 2012 61
4181 2012 49 00000000000000000
4185 2013 69 Installation/affectation
4186 2013 49 00000000000000000
4187 2014 51 Usure Normale

Table NatDem (nature demande)

ID_Nat NatDsc
---------------------------
15 Exploitation
16 Incident
17 Information
18 Incident Bloquant
Donc mon objectifs est d'afficher la liste de toutes les demandes avec leurs nature et caractéristique dans le cas ou la nature de la demande est "Exploitation" j'affiche la caractéristique si autre du vide " ",

Par exp :

Citation:
N°Dmd Nature Caractéristique
---------------------------------------------------------------------
2000 Information
2011 Exploitation Installation / affectation
2012 Incident
2013 Exploitation Installation / affectation
2014 Incident Bloquant
Mais malheureusement avec une simple requête de sélection j'ai eu le résultat suivant :

Citation:
N°Dmd IdCar Nature Caractéristique
---------------------------------------------------------------------
2011 69 Exploitation Installation / affectation
2011 49 Exploitation 00000000000000000
2012 61 Incident
2012 49 Incident 00000000000000000
2013 69 Exploitation Installation / affectation
2013 49 Exploitation 00000000000000000
2014 51 Incident Bloquant Usure Normale
Des demandes en double et d'autre non afficher

Merci de m'aider
ahmedbassou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 23h22   #6
Membre éprouvé
 
Homme Hamid MIRA
Ingénieur développement logiciels
Inscription : septembre 2003
Messages : 177
Détails du profil
Informations personnelles :
Nom : Homme Hamid MIRA
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2003
Messages : 177
Points : 413
Points : 413
C'est un peu mieux qu'avant, mais, pour moi, ce n'est toujours pas assez précis.

Si tu veux juste ne pas remonter les lignes caractéristique de la demande (ValCaracterisque) pour lesquelles le champ ValCar est vide ou égale à '00000000000000000', (la cause des doublons), essaie la requête ci-dessous :

Essaies ceci :
Code SQL :
1
2
3
4
5
6
7
8
SELECT  D.NoDmd, ISNULL(C.ValCar,'') AS ValCar 
FROM Demande D 
LEFT OUTER JOINT ( SELECT DISTINCT V.NoDmd, V.ValCar 
                   FROM ValCaracteristique V
                   WHERE V.ValCar NOT IN ('', '00000000000000000') 
                   AND   V.ValCar IS NOT NULL 
                  ) C 
ON D.NoDmd = C.NoDmd

Remarque : La jointure externe LEFT OUTER JONT va te ramener les Demandes pour lesquelles, il n' y a aucune caractéristique. Pour ces lignes le champ ValChar sera NULL transformé en chaine vide par la fonction ISNULL(..)

A+
__________________
"Une idée mal écrite est une idée fausse !"
hmira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 10h19   #7
Candidat au titre de Membre du Club
 
Inscription : janvier 2009
Messages : 14
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 14
Points : 14
Points : 14
Pour ma part je ferais un truc plus simple

Code :
1
2
3
4
5
6
7
8
9
SELECT d.NoDmd, 
           nv.Nature, 
           CASE 
                   WHEN nv.ID_NAt = 18 THEN nd.Caractéristique
                   ELSE ''
           END
FROM Demande d
INNER JOIN ValCaractéristique AS nv ON nv.ID_NAt = d.ID_NAt
LEFT JOIN NatDem AS nd ON nd.NoDmd = d.NoDmd

Attention avec cette requête tu aura par exemple deux résultats pour le NoDmd 2011.

N°Dmd IdCar Nature Caractéristique
---------------------------------------------------------------------
2011 69 Exploitation Installation / affectation
2011 49 Exploitation 00000000000000000

Si tu ne veux pas cela, soit il faut filtrer sur IdCar, soit sur Caractéristique.
Avec un Where ou un And dans la clause du JOIN.
michaud_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 15h36   #8
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Bonjour,
Je suis d'accord, vous exprimez mal votre besoin. Ne faites pas comme ici une seule et longue phrase, qui plus est sans ponctuation.

Cependant je crois avoir compris.
A priori, vous voulez avoir la liste de toutes les demandes. A cette liste vous voulez ajouter le libellé de la nature de la demande (je suppose une relation 1:1 entre les tables). Puis si la nature de la demande est "exploitation", vous voulez afficher en plus une colonne avec la valeur de la caractéristique (là je suppose qu'il n'y a qu'une caractéristique par jeux de demande et nature de demande)

J'ai donc essayé d'écrire une requête qui ferait cela, mais il faudrait tester sur un jeu de données. Lorsqu'on mélange des jointures internes et externes, il faut parfois ajouter des parenthèses, notamment ici avec le premier couple de tables, sauf que je ne sais jamais bien où il faut mettre ces parenthèses pour respecter la syntaxe, à vous de tester.

Code :
1
2
3
4
SELECT t1.N°Dmd, t1.Demandeur, t1.RcvDte, t1.ID_NAt, t2.NatDsc, t3.ValCar
FROM Table_Demande AS T1
INNER JOIN NatDem AS t2 ON t2.ID_Nat = t1.ID_NAt
LEFT OUTER JOIN ValCaractéristique AS t3 ON t3.N°Dmd = t1.N°Dmd AND t1.ID_NAt = 15
Bon courage
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h26.


 
 
 
 
Partenaires

Hébergement Web