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

Requêtes MySQL Discussion :

Requête retournant la somme de valeurs dépendantes d'une autre.


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2017
    Messages : 38
    Points : 38
    Points
    38
    Par défaut Requête retournant la somme de valeurs dépendantes d'une autre.
    Chers Forumers,

    Avec un titre si évocateur, ai-je encore besoin de vous expliquer le pourquoi de mon post ? Si ?

    Difficile de faire mieux. Ma requête est tout de même fort spécifique.

    Aussi vais-je illustrer mes propos par un exemple. Le mien pour bien faire.

    Je travaille dans une société d'achat/revente. Cette société a une base de données dans laquelle sont enregistrées un paquet de choses.
    Parmi elles, on retrouve les mouvements de ventes, dans deux tables :
    - VentesEnt : on y retrouve les données des entêtes des bons de vente, comme le client, le magasin émetteur du bon, la date etc.
    - VentesLig : cette table reprend les données des lignes des bons de vente, celles liées aux articles vendus.

    Il y a plusieurs types de bons présents dans ces tables :
    - Les bons qui sont "réellement" une vente. C'est à dire, facture, note d'envoi...
    - Les bons qui sont des retours de marchandises. Note de crédit, bon de retour...

    Chaque ligne d'un bon (VentesLig) se compose comme suit (je vous épargne les détails inutiles) :
    - Un code article
    - Un type de tarif
    - Une quantité en unité de facturation
    - Un chiffre d'affaire hors taxe

    Mon but ?

    Sortir la quantité vendue et le chiffre d'affaire réalisé sur un laps de temps :
    - Par article
    - Par dépôt (magasin)
    - Par type de tarif

    Je précise que j'importe le résultat de mes requêtes dans Excel.
    Jusque là c'est assez simple. Deux solutions s'offrent à moi.

    Tout d'abord je peux extraire toutes les lignes des ventes qui me concerne comme ceci :
    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
     
    SELECT 
    VentesEnt.CodeDépôt, 
    VentesLig.TypeTarif,
    VentesLig.CodeArticle, 
    Articles.LibelléArticle, 
    VentesLig.UF, 
    VentesLig.QtéUF, 
    VentesLig.CAHT
     
    FROM 
    Articles, 
    VentesEnt, 
    VentesLig
     
    WHERE 
    VentesEnt.NuméroBon = VentesLig.NuméroBon 
    AND VentesLig.CodeArticle = Articles.CodeArticle 
     
    AND VentesLig.DateBon BETWEEN '20170100' AND '20170200'
    Et ensuite utiliser un tableau croisé dynamique dans Excel pour dégager des totaux.

    Simple, mais inadaptée à mon cas, car la requête retourne un trop grand nombre de résultats que Excel ne peut afficher.

    Ou bien je peux extraire les totaux directement en utilisant la fonction d'agrégation SUM() et la clause GROUP BY comme ceci :
    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
     
    SELECT 
    VentesEnt.CodeDépôt, 
    VentesLig.TypeTarif,
    VentesLig.CodeArticle, 
    Articles.LibelléArticle, 
    VentesLig.UF, 
    SUM (VentesLig.QtéUF), 
    SUM (VentesLig.CAHT)
     
    FROM 
    Articles, 
    VentesEnt, 
    VentesLig
     
    WHERE 
    VentesEnt.NuméroBon = VentesLig.NuméroBon 
    AND VentesLig.CodeArticle = Articles.CodeArticle 
     
    AND VentesLig.DateBon BETWEEN '20170100' AND '20170200'
     
    GROUP BY 
    VentesLig.CodeDépôt, 
    VentesLig.TypeTarif, 
    VentesLig.CodeArticle, 
    VentesLig.UF
    Et ça fonctionne très bien.

    Et là vous vous dites... où est le problème alors ?

    Et bien il se trouve que le signe de la quantité d'une vente est mal gérée dans la DB (et que je n'ai pas autorité pour affecté la structure de la DB).
    Le signe de la quantité devrait toujours être le même que celui du CAHT (chiffre d'affaire hors taxe). Ca paraît logique. Lorsque je gagne de l'argent, j'ajoute une quantité vendue, lorsque j'en perds, c'est que je reprends une marchandise, je retire donc une quantité. Mais ce n'est pas le cas ici. Les CA sont toujours justes, mais pour diverses raisons, le signe de la quantité associé ne suit pas toujours.

    Je dois donc effectué un traitement du genre :
    Pour chaque ligne,
    Si CAHT >= 0, Alors Quantité réelle = Valeur Absolue de Quantité
    Sinon Quantité Réelle = Valeur Absolue de Quantité * -1

    Sauf que je n'extrais pas chaque ligne, mais uniquement les totaux.
    Comment pourrais-je effectuer ce correctif sur mes quantité dans ma requête SELECT ?

    Merci d'avoir pris le temps de me lire et merci pour votre aide.

    Catab

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Tout simplement avec CASE...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM (CASE WHEN VentesLig.CAHT >= 0 THEN 1 ELSE -1 END * ABS(VentesLig.QtéUF))
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2017
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2017
    Messages : 38
    Points : 38
    Points
    38
    Par défaut
    Je n'avais jamais imbriqué un CASE() dans un SUM().
    Ca paraît enfantin présenté comme ça ^^ mais la syntaxe n'est pas si intuitive, de mon point de vue.

    Je te remercie pour la solution. C'est exactement ce que je cherchais

    Catab

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

Discussions similaires

  1. Requete retournant la somme des valeurs de table
    Par charrynsasi dans le forum ADO.NET
    Réponses: 1
    Dernier message: 13/04/2012, 09h13
  2. Produit de somme de valeurs presentes dans une autre feuille
    Par seb1kl dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/05/2010, 10h08
  3. [VBA-E] 2 ListBox avec valeurs "dépendantes l'une de l'autre"
    Par dado91400 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/03/2007, 09h51
  4. [Conception] Faire une somme de valeurs définies par une boucle
    Par fixbraun dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 25/09/2006, 23h46
  5. fonction sur la somme des valeurs issues d'une requete
    Par iam dans le forum Bases de données
    Réponses: 5
    Dernier message: 15/06/2006, 21h35

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