以下sql调用正常,为客户返回正确的总零售量:
SELECT customer.id,
customer.first_name,
customer.last_name,
SUM(sales_line_item_detail.retail) AS total_retail
FROM sales_line_item_detail
INNER JOIN sales_header
ON sales_header.id = sales_line_item_detail.sales_header_id
INNER JOIN customer
ON customer.id = sales_header.customer_id
GROUP BY sales_header.customer_Id
ORDER BY total_Retail DESC
LIMIT 10
但是,我需要它来返回客户的电话和电子邮件地址..请记住,并非所有客户都有电子邮件地址和电话号码。每当我离开加入电子邮件和数字表时,它会将total_retail金额减少数千,我不知道为什么。
以下查询为total_retail字段提供了完全错误的结果:
SELECT customer.id,
customer.first_name,
customer.last_name,
IF(
ISNULL( gemstore.customer_phone_numbers.Number),
'No Number..',
gemstore.customer_phone_numbers.Number
) AS Number,
IF(
ISNULL(gemstore.customer_emails.Email),
'No Email...',
gemstore.customer_emails.Email
) AS Email,
SUM(sales_line_item_detail.retail) AS total_retail,
FROM sales_line_item_detail
INNER JOIN sales_header
ON sales_header.id = sales_line_item_detail.sales_header_id
INNER JOIN customer
ON customer.id = sales_header.customer_id
LEFT JOIN gemstore.customer_emails
ON gemstore.customer_emails.Customer_ID = gemstore.customer.ID
LEFT JOIN gemstore.customer_phone_numbers
ON gemstore.customer_phone_numbers.Customer_ID = gemstore.customer.ID
GROUP BY sales_header.customer_Id
ORDER BY total_Retail DESC
LIMIT 10
非常感谢任何帮助,弄清楚它为什么会抛弃我的结果。
谢谢!
答案 0 :(得分:2)
customer_emails或customer_phone_numbers表中是否有多条Customer_ID记录?
答案 1 :(得分:1)
您将匹配太多记录。尝试不带group by子句的查询,你会看到哪些以及如何。很可能左连接将在每个客户电子邮件/电话匹配上重复订单行。
答案 2 :(得分:1)
我不完全确定,因为我无法测试这一点,但可能会发生以下情况。
如果每个客户有多个电子邮件或电话号码,最终结果可能会成倍增加,因为新的联接。
想象一下没有group_by的查询并加入销售:
CustomerId Email phoneNumber
1 test@gmx.com 0122233
1 mail@yahoo.com 0122233
此示例中的用户有2个mailadresses。
如果您现在将联接添加到sales和group by,则会使total_retail加倍。
如果是这种情况,用LEFT OUTER JOIN替换LEFT JOIN应该可以解决问题。在这种情况下,您只会看到客户的第一个电子邮件/电子邮件。