J'ai 3 tables avec les colonnes suivantes, elles sont:
Les relations des 3 tables sont comme ceci: Thead - Tdetail - Tsubdetail. P>
J'espère que les images suivantes peuvent les montrer clairement. p>
Ceci est ma requête MySQL: p> 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. P> de l'image que vous pouvez voir à partir de l'échantillon de surbrillance jaune: p> pour padcode = 'kvbs-b' < / fort> p> Je veux obtenir le qty ok = 2845 et la somme ng de la tête de table = 705. P>
Mais de la requête ci-dessus, j'ai eu le mauvais résultat, ok = 3245 et ng =
905. P>
BlockQuote> 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? P> J'espère que quelqu'un peut m'aider et expliquer quelle est la requête correcte. Merci d'avance pour m'aider. P> p>
4 Réponses :
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
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. p>
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. P>
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. P>
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. P>
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
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.
Le podcode est-il unique dans Thlead?
@forpas semble que ce ne soit pas selon les données d'échantillon