0
votes

MySQL Sum avec 3 tables de relation

J'ai 3 tables avec les colonnes suivantes, elles sont:

  1. THEAD - HeadID (PK), Padcode, Okqty, Totngqty
  2. tdetail - headide (FK), processus, nom, sous-code
  3. tsubdetail - sous-code (FK), NGCode, Ngqty

    Les relations des 3 tables sont comme ceci: Thead - Tdetail - Tsubdetail.

    J'espère que les images suivantes peuvent les montrer clairement.

    Tables avec Exemple de données

    Ceci est ma requête MySQL: xxx

    Je veux résumer la quantité OK et tongqty sans ajouter les mêmes valeurs du même tsubdetail.subcode. J'ai essayé distinct, mais ce n'était pas une solution.

    de l'image que vous pouvez voir à partir de l'échantillon de surbrillance jaune:

    pour padcode = 'kvbs-b' < / fort>

    Je veux obtenir le qty ok = 2845 et la somme ng de la tête de table = 705.

    Mais de la requête ci-dessus, j'ai eu le mauvais résultat, ok = 3245 et ng = 905.

    Je sais que les mêmes valeurs du même tsubdetail.subcode ont été ajoutées plusieurs fois. Mais quelle est la requête correcte afin que je puisse obtenir le vrai résultat?

    J'espère que quelqu'un peut m'aider et expliquer quelle est la requête correcte. Merci d'avance pour m'aider.


2 commentaires

Le podcode est-il unique dans Thlead?


@forpas semble que ce ne soit pas selon les données d'échantillon


4 Réponses :


0
votes

Si vous sélectionnez ceci, vous pouvez voir quelles lignes sont doubles et seront donc comptées Double:

SELECT
  THead.padcode,
  THead.okqty,
  THead.TotNGqty
  TDetail.HeadID,
  TsubDetail.Subcode,
  If(TSubDetail.NGCode = 'L3', NGqty, 0) AS L3
FROM THead 
  JOIN TDetail ON THead.HeadID = TDetail.HeadID
  JOIN TSubDetail ON TDetail.Subcode=TSubDetail.Subcode


0 commentaires

0
votes

Vous montrez un sous-ensemble de vos données, il est donc difficile de répondre définitivement, mais votre groupe par clause ne comprend que la colonne «Padcode» et non la colonne de la tête.

Je suppose que dans l'ensemble de la table, vous avez des enregistrements avec le même padcode (kvbs-b) pour plusieurs casques, non seulement pour ceux montrés en jaune. En conséquence, ils ont également été résumés, mais vous ne pouvez pas voir lesquels, à cause du groupe trop général de.


0 commentaires

0
votes

Compte tenu de la requête ci-dessus est ce qui est requis et il n'y a pas de contraintes supplémentaires. Vous pouvez le faire en exécutant deux requêtes.

Pour la première requête, vous pouvez obtenir la somme ok et totalng en regroupant PADCODE et ne pas joindre à d'autres tables. Et pour la deuxième requête, obtenez la somme L3 en joignant des tables et en rejoignant enfin les deux requêtes ci-dessus par Padcode.


0 commentaires

0
votes

Utilisez une sous-requête corrélée dans la clause Select. De cette façon okqty code> et tongqty code> ne sera pas multiplié par le nombre de lignes associées dans tsubdetail code>.

SELECT
    THead.padcode,
    SUM(THead.okqty) AS OK,
    SUM(THead.TotNGqty) AS TOTALNG,
    SUM(x.L3) as L3
FROM THead
LEFT JOIN(
    SELECT TDetail.HeadID, SUM(TSubDetail.NGqty) as L3
    FROM TDetail
    JOIN TSubDetail ON TDetail.Subcode=TSubDetail.Subcode
    WHERE TSubDetail.NGCode = 'L3'
    GROUP BY TDetail.HeadID
) x ON x.HeadID = THead.HeadID
GROUP BY THead.padcode


1 commentaires

Merci beaucoup @ Paul-Spiegel. Vos deux réponses génèrent le bon résultat. Depuis que j'ai essayé le code et j'ai reçu le résultat NULL pour la colonne L3, je dois utiliser la fonction de coalesce. Et puisque je veux ajouter une autre colonne comme L3, je vais utiliser la réponse supérieure. Merci beaucoup.