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

Langage SQL Discussion :

Problème avec GROUP BY


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 26
    Points
    26
    Par défaut Problème avec GROUP BY
    Bonjour,
    J'ai un problème avec une requête faisant appel à un GROUP BY. La voici :

    INSERT INTO [...].[Délais de Facturation - France]

    SELECT
    Sum([Position de Bon de Livraison].[Quantité Livrée] * [Position de Bon de Livraison].[Prix Unitaire de Vente Brut en Euro] / 1000) AS [Montant Net],
    Trim(Right([Position de Bon de Livraison].[Numéro de Facture], 7)) AS [Numéro de Facture],
    Right([Position de Bon de Livraison].[Numéro de Bon de Livraison], 7) AS [Numéro de Bon de Livraison],
    Right([Position de Bon de Livraison].[Numéro de Commande], 7) AS [Numéro de Commande],
    [Position de Commande].[Code Client] AS [Code Client],
    [Position de Commande].[Code Vendeur] AS [Code Vendeur],
    (Right(Str([Position de Bon de Livraison].[Date de Facturation]), 2) & "/" & Mid(Str([Position de Bon de Livraison].[Date de Facturation]), 6, 2) & "/" & Mid(Str([Position de Bon de Livraison].[Date de Facturation]), 2, 4)) AS [Date de Facturation],
    [En-tête de Commande].[Code de Bloquage] AS [Code de Bloquage],
    IIf([En-tête de Commande].[Date de Débloquage] <> 0, Right(Str([En-tête de Commande].[Date de Débloquage]), 2) & "/" & Mid(Str([En-tête de Commande].[Date de Débloquage]), 6, 2) & "/" & Mid(Str([En-tête de Commande].[Date de Débloquage]), 2, 4)) AS [Date de Débloquage],
    [En-tête de Commande].[Code du Responsable] AS [Code Secrétaire],
    [Client].[Raison Sociale 1] AS [Raison Sociale],
    (Right(Str([Position de Commande].[Délai Confirmé]), 2) & "/" & Mid(Str([Position de Commande].[Délai Confirmé]), 6, 2) & "/" & Mid(Str([Position de Commande].[Délai Confirmé]), 2, 4)) AS [Délai Confirmé Actuel],
    (Right(Str([En-tête de Bon de Livraison].[Date d'Edition]), 2) & "/" & Mid(Str([En-tête de Bon de Livraison].[Date d'Edition]), 6, 2) & "/" & Mid(Str([En-tête de Bon de Livraison].[Date d'Edition]), 2, 4)) AS [Date d'Expédition],
    (Right(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2) & "/" & Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 6, 2) & "/" & Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2, 4)) AS [Date du Mouvement de Stock],
    IIf(Weekday(DateSerial(Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2, 4), Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 6, 2), Right(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2)) , 2) = 1, "Lundi", IIf(Weekday(DateSerial(Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2, 4), Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 6, 2), Right(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2)) , 2) = 2, "Mardi", IIf(Weekday(DateSerial(Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2, 4), Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 6, 2), Right(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2)) , 2) = 3, "Mercredi", IIf(Weekday(DateSerial(Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2, 4), Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 6, 2), Right(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2)) , 2) = 4, "Jeudi", IIf(Weekday(DateSerial(Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2, 4), Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 6, 2), Right(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2)) , 2) = 5, "Vendredi", IIf(Weekday(DateSerial(Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2, 4), Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 6, 2), Right(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2)) , 2) = 6, "Samedi", IIf(Weekday(DateSerial(Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2, 4), Mid(Str([Position de Bon de Livraison].[Date de Mise à jour]), 6, 2), Right(Str([Position de Bon de Livraison].[Date de Mise à jour]), 2)) , 2) = 7, "Dimanche"))))))) AS [Jour du Mouvement de Stock]

    FROM (((([Position de Bon de Livraison] INNER JOIN [Position de Commande] ON [Position de Bon de Livraison].[Numéro de Position de Commande] = [Position de Commande].[Numéro de Position de Commande]) INNER JOIN [En-tête de Commande] ON [Position de Bon de Livraison].[Numéro de Commande] = [En-tête de Commande].[Numéro de Commande]) INNER JOIN Client ON [Position de Commande].[Code Client] = Client.[Code Client]) INNER JOIN [En-tête de Bon de Livraison] ON [Position de Bon de Livraison].[Numéro de Bon de Livraison] = [En-tête de Bon de Livraison].[Numéro de Bon de Livraison]) LEFT JOIN [Adresse de Livraison] ON [Position de Bon de Livraison].[Numéro de Commande] = [Adresse de Livraison].[Numéro de Commande]

    WHERE Val(Mid(Str([Position de Bon de Livraison].[Date de Facturation]), 6, 2)) = Month(Date()) AND Val(Mid(Str([Position de Bon de Livraison].[Date de Facturation]), 2, 4)) = Year(Date()) AND (([Adresse de Livraison].[Numéro de Commande] <> NULL AND [Adresse de Livraison].[Code Pays] = "FR") OR (IsNull([Adresse de Livraison].[Numéro de Commande]) AND [En-tête de Bon de Livraison].[Code Pays] = "FR")) AND Trim([Position de Bon de Livraison].[Numéro de Facture]) <> ""
    GROUP BY ([Position de Bon de Livraison].[Numéro de Facture];

    Elle est particulièrement lourde. Je m'en excuse et remercie ceux qui auront eu le courage de se pencher dessus...
    Le problème avec cette requête c'est que je reçois un message d'erreur : "You tried to execute a query that does not include Trim(Right([Position de Bon de Livraison].[Numéro de Facture], 7)) as part of an aggregate function".
    Le principe de ma requête est de regrouper tous mes enregistrements par numéro de facture et de faire la somme de leur montant net (que je calcule directement).
    Au sujet de cette erreur, j'ai trouvé cette page, http://www.developpez.net/forums/viewtopic.php?t=199243, mais je n'arrive pas à appliquer la solution à ma requête.
    Quelqu'un pourrait-il m'aider?

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut Re: Problème avec GROUP BY
    Citation Envoyé par Korskarn
    Elle est particulièrement lourde. Je m'en excuse et remercie ceux qui auront eu le courage de se pencher dessus...
    Elle est surtout complétement illisible, car non indentée !
    Merci de jeter un oeil sur les Conseils à lire avant de poster.

    Le lien que tu donnes explique en effet la cause de ton erreur :
    En bref, complète ta clause GROUP BY par tous les champs hors fonctions d'aggrégations de ton SELECT ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GROUP BY ([Position de Bon de Livraison].[Numéro de Facture], 
    Trim(Right([Position de Bon de Livraison].[Numéro de Facture], 7)) AS [Numéro de Facture], ...;
    Vu que tu as une énorme liste de champs, il faudra dupliquer cette liste dans ta clause group by !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    J'ai retravaillé la présentation, j'espère que cela suffira...
    Je vais essayer ta solution. Mais je ne comprends pas bien la logique de celle-ci. Je voudrais faire un regroupement sur les numéros de facture identiques, je pensais donc que la clause GROUP BY me permattait de faire justement ce regroupement sur le(s) champ(s) de mon choix. Je ne comprends pas bien la logique de faire un regroupement sur tous les champs (autres que ceux utilisés dans ma fonction Sum()), puiqu'ils ne sont pas tous identiques, seul numéro de facture l'est. Ou alors j'ai rien compris à cette clause... Ou alors j'ai une erreur dans ma réflexion... 'fin bref, j'essaie et je reviens...
    Merci.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    J'ai donc suivi les conseils de Xo. Ma clause GROUP BY est donc celle-ci maintenant :
    GROUP BY [Position de Bon de Livraison].[Numéro de Facture], [Position de Bon de Livraison].[Numéro de Bon de Livraison], [Position de Bon de Livraison].[Numéro de Commande], [Position de Commande].[Code Client], [Position de Commande].[Code Vendeur], [Position de Bon de Livraison].[Date de Facturation], [En-tête de Commande].[Code de Bloquage], [En-tête de Commande].[Date de Débloquage], [En-tête de Commande].[Code du Responsable], [Client].[Raison Sociale 1], [Position de Commande].[Délai Confirmé], [En-tête de Bon de Livraison].[Date d'Edition], [Position de Bon de Livraison].[Date de Mise à jour];

    Effectivement, ma requête fonctionne. En revanche, il s'est passé ce que je craignais, un mauvais regroupement. Puisque dans ma clause GROUP BY, je lui dis de me le faire également sur [Position de Commande].[Délai Confirmé], si ces dates sont différentes, il me crée deux enregistrements distincts et mon montant net, n'est donc plus bon, puisque je suis censé les additionner. Mais peut-être que la clause GROUP BY n'est pas ma solution pour ce regroupement. Peut-être que mon algo n'est pas bon... Y aurait-il une autre clause que je puisse utiliser pour ce problème? Ou voyez-vous l'erreur dans mon code?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Problème résolu ; je garde mes deux enregistrements différents.
    Merci Xo pour ton aide technique.

  6. #6
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Korskarn
    Effectivement, ma requête fonctionne. En revanche, il s'est passé ce que je craignais, un mauvais regroupement. Puisque dans ma clause GROUP BY, je lui dis de me le faire également sur [Position de Commande].[Délai Confirmé], si ces dates sont différentes, il me crée deux enregistrements distincts et mon montant net, n'est donc plus bon, puisque je suis censé les additionner. Mais peut-être que la clause GROUP BY n'est pas ma solution pour ce regroupement. Peut-être que mon algo n'est pas bon... Y aurait-il une autre clause que je puisse utiliser pour ce problème? Ou voyez-vous l'erreur dans mon code?
    Dans un tel cas, si tu ne veux pas de ton champ "date" dans le GROUP BY, il faut également l'enlever de la liste des champs de ton SELECT.

    Comme l'a expliqué Médiat sur l'autre post, tu peux vouloir consolider des données, comme par exemple faire une SOMME :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A, B, C, SUM(Montant)
      FROM MaTable
     WHERE ...
    GROUP BY A, B, C
    Cette requête signifie que tu regroupe tous les enregistrements pour lesquels les valeurs de A, B et C sont identiques, et que tu fais la somme du champ Montant par triplet (A, B, C).

    Maintenant, si C est une date, et que tu ne veux pas le détail des montants par date, il te suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A, B, SUM(Montant)
      FROM MaTable
     WHERE ...
    GROUP BY A, B
    Et tu auras tes sommes par couples (A, B).

    Un peu de lecture sur le sujet : SQL : Groupage, ensembles et sous ensembles

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Merci pour tes explications et merci pour la doc, Xo... A plus.

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

Discussions similaires

  1. problème avec group by
    Par rico3434 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 13/02/2008, 14h07
  2. problème avec GROUP BY
    Par benjisan dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 14/06/2007, 11h48
  3. [XI] problème avec groupe sur un champ trié par origine ?
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 11/04/2007, 15h31
  4. Problème avec group by...
    Par gdido dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/07/2005, 09h34
  5. [débutant] problème avec Group by
    Par Amenofis dans le forum Débuter
    Réponses: 5
    Dernier message: 25/05/2005, 09h57

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