none
Nombre de rangée retourné sur une requête avec jointure RRS feed

  • Question

  • Bonjour j'ai deux table dans une base donnée, j'ai plusieurs enregistrement dans les deux tables, ma deuxième table est lié sur la première, donc pour chaque enregistrement de ma première table je peux avoir plusieurs enregistrement de la deuxième table, comment je peut avec sql obtenir le résultat du nombre d'enregistrement de ma deuxième table pour chaque enregistrement de ma première table?

     

    merci

    vendredi 14 octobre 2011 10:00

Réponses

  • Bonjour,

    Il serait possible de faire qq chose comme SELECT Commande,COUNT(*) FROM Inventaire GROUP BY Commande ce qui permettra d'avoir le nombre de lignes par commande.

    Si on veut la liste y compris avec zéro lignes (si c'est possible ?) on peut combiner cette requête avec une autre par exemple qq chose comme (non testé) :

     

    SELECT Commande.Commande,COALESCE(Compteur,0) AS Compteur
    FROM Commande
    LEFT JOIN (
       SELECT Commande,COUNT(*) AS Compteur
       FROM Inventaire
       GROUP BY Commande
    ) g
    ON g.Commande=Commande.Commande
    
    On prends toutes les commandes, on fait la jointure avec la ligne qui donne le nombre de lignes par commande et avec COASLESCE on prend 0 si on n'a pas trouvé de détails.

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Proposé comme réponse Ciprian Duduiala lundi 17 octobre 2011 10:26
    • Marqué comme réponse NeoBugs lundi 17 octobre 2011 12:30
    dimanche 16 octobre 2011 18:21

Toutes les réponses

  • Bon je comprend pas, que je clique dans mon courriel ou que je viennent vérifier mes threads ici, je ne vois pas ta réponse, je ne la vois que dans le courriel, enfin j'espère que tu auras la mienne :)

    Je suis pas super expert en sql, je comprend la plupart des choses, mais moins les termes comme clé étrangère.  Je ne voudrais pas que cela ne sois confondu, mais en gros ma deuxième table contient un champ (nommer #commande) qui lie les enregistrement à ma première table, donc par exemple comme dans une combinaison traditionelle commande (ma première table) - inventaire (ma deuxième table).  Je peux donc avoir plusieurs items d'inventaire pour une seul commande et le nombre d'item d'inventaire peux varier d'une commande à une autre.

    Ce que je voudrais pour chaque commande, serais de savoir le nombre d'item d'inventaire en commande :)

    merci

    vendredi 14 octobre 2011 15:33
  • Bonsoir,

    Pourrait-on avoir le script de vos tables au minimum ? C'est bien plus facile pour vous aider ...

    ++


    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1
    vendredi 14 octobre 2011 16:45
    Modérateur
  • bonjour et merci de ta réponse, il y aurais un script asser long pour les deux tables actuels que j'ai, mais j'ai créer deux table à titre d'exemple, je t'épargne certaine ligne commune à sql pour exécuter du code et dans quelle base de donnée, mais le script principale que j'ai pour chaque table serais ceci:

    table commande

    CREATE TABLE [dbo].[Commande](
    	[Commande] [int] IDENTITY(1,1) NOT NULL,
    	[Client] [int] NULL,
     CONSTRAINT [PK_Commande] PRIMARY KEY CLUSTERED 
    (
    	[Commande] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    

    table inventaire

    CREATE TABLE [dbo].[Inventaire](
    	[Inventaire] [int] IDENTITY(1,1) NOT NULL,
    	[Commande] [int] NULL,
    	[Description] [nvarchar](64) NULL,
     CONSTRAINT [PK_Inventaire2] PRIMARY KEY CLUSTERED 
    (
    	[Inventaire] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    


    le champ commande dans la table inventaire spécifie à quelle commande est relié mon item d'inventaire, donc lorsque je veux savoir les items d'inventaire pour un numéro de commande donné, je filtre ce champ sur le numéro de la commande.

    ma question est que si j'ai plusieurs commande avec plusieurs item d'inventaire dans chaque commande, comment je peux sortie une variable ou afficher dans une table chaque commande qui contiendrais que le nombre d'item d'inventaire que j'ai pour chaque commande

    Commande #1 = 12 items d'inventaire

    Commande #2 = 3 items d'inventaire

    et ainsi de suite...

    merci


    • Modifié NeoBugs dimanche 16 octobre 2011 03:02
    dimanche 16 octobre 2011 03:02
  • Bonjour,

    Il serait possible de faire qq chose comme SELECT Commande,COUNT(*) FROM Inventaire GROUP BY Commande ce qui permettra d'avoir le nombre de lignes par commande.

    Si on veut la liste y compris avec zéro lignes (si c'est possible ?) on peut combiner cette requête avec une autre par exemple qq chose comme (non testé) :

     

    SELECT Commande.Commande,COALESCE(Compteur,0) AS Compteur
    FROM Commande
    LEFT JOIN (
       SELECT Commande,COUNT(*) AS Compteur
       FROM Inventaire
       GROUP BY Commande
    ) g
    ON g.Commande=Commande.Commande
    
    On prends toutes les commandes, on fait la jointure avec la ligne qui donne le nombre de lignes par commande et avec COASLESCE on prend 0 si on n'a pas trouvé de détails.

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Proposé comme réponse Ciprian Duduiala lundi 17 octobre 2011 10:26
    • Marqué comme réponse NeoBugs lundi 17 octobre 2011 12:30
    dimanche 16 octobre 2011 18:21
  • Bonjour, NeoBugs,

     

    Est-ce que vous avez testé la solution proposée ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

     

    Cordialement,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    lundi 17 octobre 2011 10:28
  • Je ne considererais pas la question comme étant un problème Ciprian, mais oui en voilà le résultat :)

    La ligne de commande que Patrice a fournit fait le travail à merveille, c'est exactement ce que je recherchais :)

    Malgrer que dans mon scénario je n'ai pas besoin de connaître les commandes qui n'ont pas d'item d'inventaire, la requête retourne aussi le chiffre 0 si une commande ne contient aucun item d'inventaire, cette commande fait plus que j'en demandais, alors quoi demander de mieux :)

    Merci infiniment

    lundi 17 octobre 2011 12:29
  • Bonjour j'aimerais savoir si je voudrais aussi la même chose mais avec une deuxième table? est- ce que je peux sortir les deux résultats sur la même requête?

    exemple si j'aurais une autre table Inventaire2

    merci

    vendredi 21 octobre 2011 08:42
  • C'est exactement le même principe avec une deuxième clause LEFT JOIN...

     

     

     

     

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    vendredi 21 octobre 2011 13:25
  • j'ai essayé de copier - coller le même code et ajouter un LEFT JOIN comme tu dis :

    SELECT Commande,COUNT(*) AS Compteur FROM Inventaire2 GROUP BY Commande) h ON h.Commande=Commande.Commande

    si je remplace Inventaire2 par Inventaire comme l'autre, je n'ai pas d'erreur, si j'utilise Inventaire2, sql me mentionne que la table Commande n'existe pas :(

    tu aurais une idée?



    • Modifié NeoBugs vendredi 21 octobre 2011 13:50
    vendredi 21 octobre 2011 13:49
  • Je pensais à qq chose comme :
    
    SELECT Commande.Commande,COALESCE(Compteur1,0) AS Compteur1,COALESCE(Compteur2,0) AS Compteur2
    FROM Commande
    LEFT JOIN (
       SELECT Commande,COUNT(*) AS Compteur1
       FROM Inventaire
       GROUP BY Commande
    ) g1 ON g1.Commande=Commande.Commande
    LEFT JOIN (
       SELECT Commande,COUNT(*) AS Compteur2
       FROM Inventaire2
       GROUP BY Commande
    ) g2 ON g2.Commande=Commande.Commande
    
    


     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    vendredi 21 octobre 2011 14:25
  • je sais pas si tu es certain de ta réponse, mais je suis pas mal sur avoir fait la même chose et en vérifiant avec tes lignes, j'obtiens quand même ce message:

    Invalid column name 'Commande'

    ce que je trouve aussi étrange, c'est que ça marche avec certaine table de ma base et pas avec d'autre, entre autre Inventaire2

    vendredi 21 octobre 2011 15:10
  • Et il y a bien une colonne Commande dans la table Inventaire2 ? Il faut bien sûr modifier le nom de la colonne si ce n'est pas le même que pour la table Inventaire.

    Le mieux est de tester les requêtes séparemment. Est-ce que

      SELECT Commande,COUNT(*) AS Compteur2
       FROM Inventaire2
       GROUP BY Commande

    fonctionne ? Si on a bien ce message c'est que le nom n'est pas commande (voir si cela ne serait pas [Commande ] avec un espace en plus ce qui rendrait le problème difficile à diagnostiquer, le nom de la colonne semblant être le bon).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    lundi 24 octobre 2011 08:15