INNER JOIN pour 3 tables avec SUM de deux colonnes dans la requête SQL?

Mohamed Farouk Mohamed Fazrin:

Je les trois tableaux suivants:

Tableau client

Tableau des ventes

Tableau Sales_Payment

Je Suite à la requête pour inscrire plus de 3 tableaux

     customer.customer_id,
     customer.name,
     SUM(sales.total),
     sales.created_at,
     SUM(sales_payments.amount)
FROM
     sales INNER JOIN customer ON customer.customer_id = sales.customer_id
     INNER JOIN sales_payments ON sales.customer_id = sales_payments.customer_id
WHERE sales.created_at ='2020-04-03'
GROUP By customer.name 

Résultat Au-dessus de la requête est donnée ci-dessous sortie requête

Somme de sales.totalest le double de la somme réelle de la colonne sales.total qui a comptage 2 rangs, je dois avoir la somme réelle de cette colonne, sans doubler la somme de ces lignes, Merci pour votre aide à l' avance ..

Ashutosh Thakur:

PROBLÈME

The problem here is that there are consecutive inner joins and the number of rows getting fetched in the second inner join is not restricted. So, as we have not added a condition on sales_payment_id in the join between the sales and sales_payment tables, one row in sales table(for customer_id 2, in this case) would be mapped to 2 rows in the payment table. This causes the same values to be reconsidered. In other words, the mapping for customer_id 2 between the 3 tables is 1:1:2 rather than 1:1:1.

SOLUTION

Solution 1 : As mentioned by Gordon, you could first aggregate the amount values of the sales_payments table and then aggregate the values in sales table.

Solution 2: Vous pouvez également (à mon humble avis une meilleure approche), vous pouvez ajouter une clé étrangère entre les ventes et les tables sales_payment. Par exemple, la colonne de la table sales_payment_id sales_payment peut être introduit dans le tableau des ventes ainsi. Cela faciliterait la jonction entre ces tables et de réduire les frais généraux supplémentaires lors de l'interrogation des données.

La requête serait alors ressembler à:

`SELECT c.customer_id,
  c.name,
  SUM(s.total),
  s.created_at,
  SUM(sp.amount)
FROM customer c
INNER JOIN sales s
ON c.customer_id = s.customer_id
INNER JOIN sales_payments sp
ON c.customer_id        = sp.customer_id
AND s.sales_payments_id = sp.sales_payments_id
WHERE s.created_at      ='2020-04-03'
GROUP BY c.customer_id,
c.name,
s.created_at ;`

J'espère que cela pourra aider!

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=408533&siteId=1
conseillé
Classement