IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Req SQL sans doublons


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Points : 2
    Points
    2
    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

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    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 :
    une demande possède 0, 1 ou 2 caractéristiques
    A+

  3. #3
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT col1 
    FROM DEMANDE D 
    WHERE EXISTS(SELECT * 
                         FROM CARACTERISTIQUE C
                         WHERE C.IDDEMANDE=D.IDDEMANDE)

  4. #4
    Membre averti

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Points : 351
    Points
    351
    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

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Points : 2
    Points
    2
    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

    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 :

    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 :

    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

  6. #6
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

  7. #7
    Membre à l'essai
    Homme Profil pro
    Expert Base de Données
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Expert Base de Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Pour ma part je ferais un truc plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  8. #8
    Membre averti

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Points : 351
    Points
    351
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. Requete SELECT SQL sans doublon
    Par arnaud_76 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 17/11/2014, 07h01
  2. Affichage lignes SQL sans doublons
    Par Aquellito dans le forum ASP
    Réponses: 2
    Dernier message: 23/03/2009, 16h11
  3. [SQL] Affichage des resultats sans doublons
    Par Luverger dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/08/2007, 14h28
  4. [SQL] liste déroulante sans doublons
    Par crashdown31 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/06/2007, 20h48
  5. [SQL] Eviter doublons dans un select (sans DISTINCT)
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 40
    Dernier message: 11/07/2006, 17h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo