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 :

Requête à partir de deux tables


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut Requête à partir de deux tables
    Bonjour à tous, mes connaissances en sql sont vraiment des connaissances de base, et je bloque sur un problème de jointure.

    Je travaille sur une base hébergé sur un SQL Server 2005. Je cherche à regrouper des informations qui se trouvent dans 2 tables distinctes.
    La première me permet de récupérer le nom du(des) donneur d'ordre et le nombre d'ordre de préparation émis par ce donneur d'ordre. La seconde me permet de retrouver le nombre de lignes contenu dans un ordre de preparation.
    J'aimerais obtenir un résultat de la forme
    Donneur d'ordre | nn ordre de prepa | nb total de ligne

    Le nb total de ligne représente le nombre total de ligne contenu dans chaque ordre de préparation.

    Je dispose de 4 données communes entre mes deux tables, à savoir le nom de l'activité, le nom de l'entrepôt et les numéro d'ordre de préparation (sur 2 colonnes).

    Merci d'avance pour toutes vos réponses.

  2. #2
    Membre régulier Avatar de Macfurp
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Points : 76
    Points
    76
    Par défaut
    Bonjour,

    tu pourrais tenter une requète du genre :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select A.Donneur d'ordre ,A.nn ordre de prepa , COUNT(*)
      FROM table1 A, TABLE2 B
      WHERE A.nn ordre de prepa = B.nn ordre de prepa
      GROUP BY A.Donneur d'ordre ,A.nn ordre de prepa ;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Merci de ta réponse Macfurp, je viens de tester ta requête mais le resultat ne répond pas totalement à mes attentes. J'obtiens bien l'ensemble des donneurs d'ordre et les commandes passées, mais le nombre de ligne correspondant au commande n'est pas cohérent.

    J'ajoute quelques infos complémentaires, celà pourra peut-être aider.
    Table donneur d'ordre : OF001 a passé 3 commandes
    174 OF001
    4 OF001
    5 OF001

    Table des lignes par commandes :
    Pour la commande 174 : 3 lignes
    174 100
    174 200
    174 300
    Pour la commande 4 : 2 lignes
    2 100
    2 200
    Pour la commande 5 : 1 ligne

    Je souhaiterais obtenir quelque chose comme ça pour OF001
    OF001 174 3
    OF001 2 2
    OF001 5 1

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    La réponse donnée précédemment par Macfurp est correcte.
    Ne tenez pas compte des deux premiers éléments, ils ne sont là que pour similer vos données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    With Ordre (c_id, donneur) AS
    (
    select 174, 'OF001' union all
    select   4, 'OF001' union all
    select   5, 'OF001'
    )
      ,  Commandes (c_id, col) AS
    (
    select 174, 100 union all
    select 174, 200 union all
    select 174, 300 union all
    select   4, 100 union all
    select   4, 200 union all
    select   5, 100
    )
      select O.donneur, O.c_id, count(*) as nb_commandes
        from Ordre as O
             inner join Commandes as C
               on C.c_id = O.c_id
    group by O.donneur, O.c_id
    order by nb_commandes desc;
     
    donneur c_id        nb_commandes
    ------- ----------- ------------
    OF001   174         3
    OF001   4           2
    OF001   5           1

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Merci de ta réponse Waldar, effectivement la requête est correcte. Mais il doit manquer quelque chose dans les infos que je vous fournis. Voilà ce que je lance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select a.OECDDO AS D_ORDRE, a.OENODP AS N_ODP, count(*) as TOTAL_LIGNE 
    from HLODPEP a
    inner join HLODPLP b
    on a.OENODP = b.OLNODP and 
    where a.OECACT='CODE.DEPOT'
    GROUP BY a.OECDDO, a.OENODP order by a.OECDDO
    J'obtiens differents résultats, je n'afficherais que celui en rapport avec l'exemple précédent (j'ai un total de 3141 lignes).
    OF001 5 470
    OF001 174 171
    OF001 4 424
    Alors que si je me réfère à la table HLODPLP j'ai bien 3 lignes pour la commande 172, 2 pour la 4 et 1 pour la 5 !
    Il y a sans doute un critère qui manque, mais je ne vois pas lequel !

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Que donnent les requêtes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
      FROM HLODPLP
     WHERE OLNODP in (4, 5, 174)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
      FROM HLODPEP
     WHERE OENODP in (4, 5, 174)
       AND OECACT = 'CODE.DEPOT'
    Mon petit doigt me dit que la première requête donne les résultats dont vous parlez (2, 1 et 3 lignes), mais que dans la seconde requête vous avez plusieurs fois l'OECDDO pour les mêmes commandes !

    Au hasard, 57 fois pour la commande 174, 212 pour la commande 2 et 470 pour la 5 !

    Si j'ai raison, ce sont soit les données de votre table, soit le modèle de votre base qui sont en cause.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Je pense avoir trouvé l'origine de mes incohérences de résultats. J'ajoute dans ma requête un where sur le code activité, dans le premier temps je faisais pointer ce where sur le code activité de la table donneur d'ordre, j'obtenais alors les résultats mentionnés ci-dessus. J'ai changé pour le code activité de la table ligne de commande, et j'obtiens les bons résultats.

    Par contre je ne m'explique pas cette différence.

    Waldar : je vous retourne les résultats des requêtes dans quelques minutes.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM HLODPLP
    WHERE OLNODP IN (4, 5, 174) and OLCACT='OTO'
    Celà me retourne effectivement le nombre total de ligne pour l'ensemble des commandes (4,5 et 174) à savoir 6 lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
    FROM HLODPEP
    WHERE OENODP IN (4, 5, 174)
    AND OECACT = 'OTO'
    Celà me retourne les 3 commandes.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Voilà maintenant ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select a.OECDDO AS D_ORDRE, a.OENODP AS N_ODP, count(*) as TOTAL_LIGNE 
    from HLODPEP a
    inner join HLODPLP b
    on a.OENODP = b.OLNODP and a.OENANN = b.OLNANN
    where b.OLCACT='OTO' and a.OECDDO LIKE 'OF%'
    GROUP BY a.OECDDO, a.OENODP order by D_ORDRE ASC
    J'obtiens ce résultat :
    OF001 4 1
    OF001 5 1
    OF001 174 9
    Cela me convient mais pour condenser les informations je souhaiterais obtenir
    OF001 |3 |11

    Après tout ça, je pense que j'obtiendrais quelque chose de correct à présenter.

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Vous pouvez faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      SELECT a.OECDDO AS D_ORDRE,
             count(distinct a.OENODP) AS Nb_ODP,
             count(*) AS TOTAL_LIGNE 
        FROM HLODPEP a
             INNER JOIN HLODPLP b
               ON a.OENODP = b.OLNODP
              AND a.OENANN = b.OLNANN
       WHERE b.OLCACT = 'OTO'
         AND a.OECDDO LIKE 'OF%'
    GROUP BY a.OECDDO
    ORDER BY D_ORDRE ASC

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Merci Waldar, c'est parfait et beaucoup plus simple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/12/2013, 10h08
  2. Créer une table a partir de deux tables existantes
    Par Aguiran dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/12/2006, 08h16
  3. Requete Delete à partir de deux tables
    Par Le_Phasme dans le forum Access
    Réponses: 2
    Dernier message: 09/10/2006, 10h22
  4. [SQL] Problème avec script de pagination et requête sql sur deux tables
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2006, 14h06
  5. création de requète à partir de 2 tables
    Par cheucheu dans le forum Access
    Réponses: 4
    Dernier message: 14/12/2005, 16h49

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