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 et SQL. Discussion :

Problème sur la Fonction Sum() qui est multipliée par le nombre de tuple [AC-2002]


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Points : 1
    Points
    1
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 619
    Points : 56 854
    Points
    56 854
    Billets dans le blog
    40
    Par défaut
    bonsoir,

    j'ai un doute...

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    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 : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

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

    REQ1 (somme au niveau PART/BATCH pour T_Presta) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Delete *
    from T_EcartECTRAChimie 
    where xxxx in (..)
    Mais je ne sais aps comment la contruire, vous avez une idée?

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

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


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)));

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/08/2007, 00h39
  2. explication sur le fonction Sum dans qreport
    Par youcef_b_dz dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/05/2007, 13h04
  3. [MySQL] exécuter un script php en commande linux : problème sur les fonctions mysql
    Par dr_octopus74 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/03/2007, 16h34
  4. Réponses: 12
    Dernier message: 22/09/2006, 13h45
  5. problème sur substring (fonction inconnue)
    Par nerick dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/12/2005, 15h46

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