我有一个需要此查询的作业: 编写一个SELECT语句,为每个具有现有订单的客户返回一行。包括以下列:来自Customers表的EmailAddress,来自orderitems表的购买总和(数量*价格)和来自orderitems表的折扣总和(discountAmount *数量)。按每个客户的项目价格总计按降序对结果集进行排序。
Customers表或OrderItems表之间没有公共列,所以我进行了3表连接。使用订单表。我最终得到了这段代码:
SELECT EmailAddress, SUM(ItemPrice)*Quantity AS TotalSum, SUM(DiscountAmount)*Quantity AS TotalDiscount
FROM Customers JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
JOIN OrderItems ON Orders.OrderID = OrderItems.OrderID
GROUP BY EmailAddress, ItemPrice, Quantity
ORDER BY TotalSum DESC;
但是,如果每个电子邮件地址有多个订单,每个客户应该只有1行,则每个电子邮件地址返回的行数超过1行。我不确定为什么会返回多行。
答案 0 :(得分:2)
此查询应提供正确的输出。您似乎希望按电子邮件地址进行分组,以便数字仅通过电子邮件进行分组,然后进行调整以获得聚合内的数量。
SELECT
EmailAddress,
SUM(ItemPrice * Quantity) AS TotalSum,
SUM(DiscountAmount * Quantity) AS TotalDiscount
FROM Customers
JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
JOIN OrderItems
ON Orders.OrderID = OrderItems.OrderID
GROUP BY EmailAddress
ORDER BY TotalSum DESC;
答案 1 :(得分:0)
您(多数情况下)获得多行的原因是因为您要按三个不同的列进行分组:电子邮件,商品价格和数量。如果同一封电子邮件出现两次,但每个电子邮件的商品价格不同,则会返回多行。这是因为SQL首先按电子邮件地址分组,然后按项目价格分组,然后按数量分组。具有这3个不同组合的任何行将被视为他们自己的组。
如果每个客户需要一行,只需将您的群组限制为电子邮件地址即可。这将返回客户的电子邮件,以及所有购买的总和,以及该客户的总折扣。
编辑我认为您收到的错误是因为您试图将所有行的商品价格相加,然后将其乘以单个数量。如果你想尝试对它们进行分组,你可以从逻辑上看出为什么这没有意义。我认为处理它的最好方法是创建一个子查询,它选择所有行并返回电子邮件地址,总和和折扣。获得此子查询后,您可以将其分组。
尝试将此作为子查询:
SELECT EmailAddress, ItemPrice * Quantity AS orderSum, DiscountAmount * Quantity AS discount
FROM customers
JOIN orders ON customers.customerid = orders.customerid
JOIN orderitems ON orders.orderid = orderitems.orderid
如果它可以帮助您首先运行它以显示返回的内容,请继续。这将返回包含所需信息的所有单独行。剩下的就是对它们进行分组和总结:
SELECT EmailAddress, SUM(orderSum) AS totalSum, SUM(discount) AS totalDiscount
FROM (
SELECT EmailAddress, ItemPrice * Quantity AS orderSum, DiscountAmount * Quantity AS discount
FROM customers
JOIN orders ON customers.customerid = orders.customerid
JOIN orderitems ON orders.orderid = orderitems.orderid
) t
GROUP BY EmailAddress
ORDER BY totalSum DESC