Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/05/2011, 13h07   #1
Invité de passage
 
Homme Cyril
Étudiant
Inscription : mai 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Cyril
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 3
Points : 0
Points : 0
Par défaut Problème sur la Fonction Sum() qui est multipliée par le nombre de tuple

Bonjour,

J'ai un petit souci sur ma requête SQL suivante :

Code :
1
2
3
4
5
6
7
8
9
SELECT T_Presta.PART_PRESTA, T_Presta.BATCH_PRESTA,
 Sum(T_Presta.QUANTITE_PRESTA), Sum(T_SAP.QUANTITE_SAP)
 
FROM T_Presta LEFT JOIN T_SAP ON (T_Presta.BATCH_PRESTA=T_SAP.BATCH_SAP) 
AND (T_Presta.PART_PRESTA=T_SAP.PART_SAP)
 
GROUP BY T_Presta.PART_PRESTA, T_Presta.BATCH_PRESTA
 
HAVING (((Sum(T_Presta.QUANTITE_PRESTA))<>Sum(T_SAP.QUANTITE_SAP)));
il me retourne le résultat suivant :

Code :
1
2
3
4
5
PART_PRESTA	BATCH_PRESTA	BATCH_SAP	
2PMC0007		3900	3100
2PMC0015		503	5533
2PMC0017		63	126
2PMC0019		643	10931
A savoir que pour le PART 2PMC0007, il n'y a qu'une seule ligne pour les 2 cumuls donc cela fonctionne,
Mais par exemple pour le Part 2PMC0015, la bonne quantité est 503, mais pour la quantité du BATCH_SAP elle est multipliée par 11, dû au nombre de ligne dans la Table SAP où pour le Part 2PMC0015 la Batch_SAP est représentée 11 fois avec des quantités différentes mais dont la somme est égale à 503.
Donc elle ne devrait pas figurer dans les résultats car la requête me donne les PART et Batch qui ont un cumul différent.

J'ai vu sur le net une solution avec une jointure Externe mais je ne l'ai pas comprise..

Merci de votre aide
b3rz3k est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 22h14   #2
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
bonsoir,

j'ai un doute...

Code sql :
1
2
3
4
5
6
7
8
9
SELECT T_Presta.PART_PRESTA, T_Presta.BATCH_PRESTA,
 Sum(T_Presta.QUANTITE_PRESTA), Sum(T_SAP.QUANTITE_SAP)
 
FROM T_Presta LEFT JOIN T_SAP ON (T_Presta.BATCH_PRESTA=T_SAP.BATCH_SAP) 
AND (T_Presta.PART_PRESTA=T_SAP.PART_SAP)
 
GROUP BY T_Presta.PART_PRESTA, T_Presta.BATCH_PRESTA
 
HAVING (((Sum(T_Presta.QUANTITE_PRESTA))<>Sum(T_SAP.QUANTITE_SAP)));

Le Sum en rouge ne serait-il pas de trop ?

Sinon, donne un exemple plus significatif. Un SELECT comprenant 4 colonnes avec un résultat qui n'en retourne que 3 ce n'est pas très clair ton histoire
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 22h29   #3
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

Le plus simple est de passer par des requêtes intermédiaires.

REQ1 (somme au niveau PART/BATCH pour T_Presta) :
Code :
1
2
3
SELECT T_Presta.PART_PRESTA, T_Presta.BATCH_PRESTA, Sum(T_Presta.QUANTITE_PRESTA) As QTE_PRESTA
FROM T_Presta
GROUP BY T_Presta.PART_PRESTA, T_Presta.BATCH_PRESTA
REQ2 (somme au niveau PART/BATCH pour T_SAP) :
Code :
1
2
3
SELECT T_SAP.PART_SAP, T_SAP.BATCH_SAP, Sum(T_SAP.QUANTITE_SAP) As QTE_SAP
FROM T_SAP
GROUP BY T_SAP.PART_SAP, T_SAP.BATCH_SAP
Tu n'a plus qu'à faire ta requête entre les requêtes REQ1 et REQ2.

Pour des gros volumes de données, il peut être avantageux de passer par des tables intermédiaires, c'est à dire transformer les requêtes REQ1 et REQ2 en requêtes de création de tables.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 10h20   #4
Invité de passage
 
Homme Cyril
Étudiant
Inscription : mai 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Cyril
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 3
Points : 0
Points : 0
Merci pour vos réponsses,
Je vais être plus précis, tout d'abord j'ai réussi à obtenir ce que je voulais mais je vais vous éclairer sur mes tables :

J'ai en gros 2 tables : T_SAP et T_PRESTA, ces deux tables sont alimentées par une importation de données via deux fichier excel ( je ne rentre pas dans les détails, ça marche ^^).

Le but étant de trouver les erreurs entre ces deux tables (Numéro de batch présent chez l'un et l'autre non, Quantité différentes etc etc).

J'ai donc deux requètes qui vérifient cela et insèrent les écarts en créant une nouvelle table (T_EcartECTRAChimie), mais ces deux requêtes laissent passer le problème que j'ai exposé plus haut : Je me retrouve donc avec des "fausses erreurs".
Le but de la Requête que je suis entrain d'écrire et de supprimer de la table T_EcartECTRAChimie ces erreurs.

La requête qui marche :

Code :
1
2
3
4
5
6
7
8
9
SELECT T_Presta.PART_PRESTA, T_Presta.BATCH_PRESTA,
 Sum(T_Presta.QUANTITE_PRESTA), Sum(T_SAP.QUANTITE_SAP)/Count(T_SAP.QUANTITE_SAP), Count(T_SAP.QUANTITE_SAP)
 
FROM T_Presta LEFT JOIN T_SAP ON (T_Presta.PLANT_PRESTA=T_SAP.PLANT_SAP) AND (T_Presta.PART_PRESTA=T_SAP.PART_SAP) AND (T_Presta.BATCH_PRESTA=T_SAP.BATCH_SAP) AND (T_Presta.VENDORCODE_PRESTA=T_SAP.VENDORCODE_SAP)
 
GROUP BY T_Presta.PART_PRESTA, T_Presta.BATCH_PRESTA
 
HAVING (((Sum(T_Presta.QUANTITE_PRESTA))=Sum(T_SAP.QUANTITE_SAP)/Count(T_SAP.QUANTITE_SAP)) 
And ((Count(T_SAP.QUANTITE_SAP))>1));
cela me retourne ceci :
Code :
1
2
3
4
5
6
7
PART_PRESTA	BATCH_PRESTA	QTE_PRESTA	QTE_SAP	NB_LIGNE_PRESTA 
2CPA0006	6757034	15	15	2
2CPA2002	6806154	19	19	2
2PMC0004		15900	15900	2
2PMC0015		503	503	11
2PMC0019		643	643	17
2PMC0067		72	72	2
Donc génèralement la QTE SAP est contenue en une seule ligne, mais chez le PRESTA il peut y avoir plusieurs lignes, 17 pour le 2PMC0019, ce sont ces fausses erreurs que je veux enlever,

du coup j'ai pensé à cette requête :

Code :
1
2
3
DELETE *
FROM T_ECARTECTRAChimie
WHERE EXISTS ( "La requête du dessu qui marche")
Cependant elle me propose de supprimer tout mes tuples car ma requête retourne un résultat non vide.
Donc il faut que je procède avec une requête de la forme suivante :

Code :
1
2
3
Delete *
from T_EcartECTRAChimie 
where xxxx in (..)
Mais je ne sais aps comment la contruire, vous avez une idée?
b3rz3k est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 15h13   #5
Invité de passage
 
Homme Cyril
Étudiant
Inscription : mai 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Cyril
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 3
Points : 0
Points : 0
Sujet à clore, j'ai trouvé la solution comme un grand ^^
Pour ceux et celles à qui ça interesse :


Code :
1
2
3
4
5
6
7
DELETE *
FROM T_ECARTECTRAChimie
WHERE T_ECARTECTRAChimie.PART_ECART in (
SELECT T_Presta.PART_PRESTA
FROM T_Presta LEFT JOIN T_SAP ON (T_Presta.VENDORCODE_PRESTA = T_SAP.VENDORCODE_SAP) AND (T_Presta.BATCH_PRESTA = T_SAP.BATCH_SAP) AND (T_Presta.PART_PRESTA = T_SAP.PART_SAP) AND (T_Presta.PLANT_PRESTA = T_SAP.PLANT_SAP)
GROUP BY T_Presta.PART_PRESTA, T_Presta.BATCH_PRESTA
HAVING (((Sum(T_Presta.QUANTITE_PRESTA))=Sum([T_SAP].[QUANTITE_SAP])/Count([T_SAP].[QUANTITE_SAP])) AND ((Count(T_SAP.QUANTITE_SAP))>1)));
b3rz3k est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h41.


 
 
 
 
Partenaires

Hébergement Web