我正在尝试使用聚合函数来合并数据,但是我不确定自己做错了什么

时间:2018-06-22 06:47:55

标签: sql sql-server

我必须找到每单位数量和价格的总价。如何以一种可以合并一个人的所有订单及其订购总价的方式来完成这项工作?

我是SQL的新手,不确定从哪里开始修复此问题。

SELECT DISTINCT Orders.OrderID, Customers.ContactName, Orders.OrderDate, [Order 
Details].Quantity * [Order Details].UnitPrice
FROM Orders, Customers, [Order Details]
WHERE Orders.CustomerID = Customers.CustomerID 
AND Orders.ShipCountry = 'Spain'

2 个答案:

答案 0 :(得分:1)

我可以建议您做三件重要的事情:

  1. 使用显式的JOIN语法:不要用逗号分别编写表,对它们使用显式的JOIN,这样会迫使您此时编写它们的链接,以便以后阅读。您的尝试缺少订单和订单详细信息之间的链接,可能导致结果重复很多。
  2. 聚合需要一个GROUP BY。每当您要应用诸如SUMMAXCOUNT之类的聚合函数时,(大多数)您将需要一组要分组在一起的列。这些列放在GROUP BY子句中。
  3. 如果不确定所获得的结果,请不要使用DISTINCT。看来您使用DISTINCT来掩盖订单和订单详细信息之间缺少的链接,因此它只列出唯一性,而不是您选择返回的实际数据。

    SELECT 
        C.CustomerID,
        C.ContactName,
        O.OrderID,
        O.OrderDate,
        TotalPrice = SUM(D.Quantity * D.UnitPrice)
    FROM 
        Orders AS O
        INNER JOIN Customers AS C ON O.CustomerID = C.CustomerID
        INNER JOIN [Order Details] AS D ON O.OrderID = D.OrderID
    WHERE 
        O.ShipCountry = 'Spain'
    GROUP BY
        C.CustomerID,
        C.ContactName,
        O.OrderID,
        O.OrderDate
    

答案 1 :(得分:0)

我认为您想像这样进行加入...

    SELECT DISTINCT Orders.OrderID, Customers.ContactName, Orders.OrderDate, 
    [Order Details].Quantity * [Order Details].UnitPrice FROM Orders left join 
    Customers on Orders.CustomerID = Customers.CustomerID left join [Order 
    Details] on Orders.CustomerID = [Order Details].CustomerID where 
    Orders.ShipCountry = 'Spain'