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 :
Et ensuite utiliser un tableau croisé dynamique dans Excel pour dégager des totaux.
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'
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 :
Et ça fonctionne très bien.
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 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
Partager