分组依据返回多行

时间:2014-10-21 03:30:02

标签: sql group-by aggregate-functions

我有一个需要此查询的作业: 编写一个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行。我不确定为什么会返回多行。

2 个答案:

答案 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