0
votes

Somme multiple dans la requête SQL, y compris la jointure gauche

Je veux afficher tout l'ordre de travail pour un client spécifique avec la somme de ce qu'il nous doit.

Mon problème est que, avec ma requête actuelle, dès qu'il y a plus d'un produit ("Table de" Work_Order_Products ' ), Times multiplie par le nombre d'enregistrements renvoyés par la table 'Work_order_Products'.

est-il un moyen de surmonter ce problème? Merci xxx


1 commentaires

Si vous n'avez pas quitté la jointure (Sélectionnez la somme (Quantité * Prix) du groupe Work_Order_Products par ID_WorkOrder) WOP sur sur wop.id_workorder = w.id_workorder? Je ne peux pas courir la requête mais je pense que cela résout la multiplication. Vous devez faire la même chose avec work_order_instructions. Essayez de commenter le groupe et le SUM-S et la vérification avec JOIN multiplie le nombre de lignes.


3 Réponses :


1
votes

J'essaierais une sous-requête corrélée au lieu d'une somme:

Remplacement: xxx

avec: xxx


0 commentaires

0
votes

Dans la ligne de ce que Chris a suggéré, cela pourrait fonctionner: xxx

c'est-à-dire, utilisez des parenthèses pour fabriquer des "sous-tables" qui nécessiteront leurs propres alias. (Il pourrait y avoir des erreurs de syntaxe ici. Je n'ai pas les données pour exécuter cela, bien sûr.)


1 commentaires

Merci Jamie, oui ça marche, mais je préfère la solution Chris, beaucoup plus rapide!



0
votes

Afin d'éviter le multiplicateur de l'un des work_order_products code> ou des tables code> work_ord_instructions code>, gérez vos agrégations avant de rejoindre les tables.

SELECT
  W.ID_WorkOrder AS ID_WorkOrder
 ,W.Number AS Number
 ,W.Date AS Date
 ,C.Name AS Name
 ,WOP.totProducts
 ,WOI.totTimes
FROM
  Work_Order AS W
LEFT JOIN
  (
    SELECT 
      ID_WorkOrder
      ,SUM(Quantity * Price) AS totProducts
    FROM
      Work_Order_Products
    GROUP BY
      ID_WorkOrder

  ) AS WOP
    ON
    WOP.ID_WorkOrder = W.ID_WorkOrder
LEFT JOIN
  (
    SELECT 
      ID_WorkOrder
      ,SUM(Times) AS totTimes
    FROM
      Work_Order_Instructions
    GROUP BY
      ID_WorkOrder
  ) AS WOI
    ON
    WOI.ID_WorkOrder = W.ID_WorkOrder
LEFT JOIN
  Customers AS C
    ON
    C.ID_WorkOrder = W.ID_Customer
WHERE
  W.ID_Customer = x;


1 commentaires

Merci Eric, oui ça marche, mais je préfère la solution Chris, beaucoup plus rapide!