Northwind多表上的SQL查询

时间:2016-02-28 18:50:01

标签: sql sql-server

从Northwind数据库我希望获得emplyee销售所产生的总收入

员工 - >订单 - > “订单详情”

我不确定我的解决方案是否提供了正确的数据(这是部分猜测)

SELECT 
    Employees.FirstName, Employees.LastName,
    SUM(CONVERT(MONEY, ("Order Details".UnitPrice * Quantity * (1 - Discount) / 100)) * 100) AS ExtendedPrice
FROM 
    ((Orders
INNER JOIN 
    "Order Details" ON Orders.OrderID = "Order Details".OrderID)
INNER JOIN 
    Employees ON Orders.EmployeeID = Employees.EmployeeID)
GROUP BY 
    LastName, FirstName;

Northwind database structure can be found here

提前谢谢你。有一个很好的解释也很棒

1 个答案:

答案 0 :(得分:4)

克里斯,你的努力是非常好的第一次努力,因此有一些事情需要改变。

  1. 您不需要除以100然后乘以100.折扣已经是%。您的操作只会截断数字。我会在过程中过早地避免这种情况,因为它会引入舍入错误。最好保持数字原始并尽可能保持精确度尽可能长。可以在GUI中将数字显示为货币,即由于截断引入的错误而在2位小数但不在中间计算中。
  2. 带有空格的表名和字段名应使用[]而不是引号来处理。这样可以更容易地找到拼写错误,因此请使用[订单明细]
  3. 分组和求和时,请确保使用键。因此,name不是密钥,因此如果您尝试对单个员工进行分组,请使用EmployeeID,这是因为在真实数据集中,您可能有2名具有相同名称的员工,并且他们的销售将使用您的代码错误地组合在一起。
  4. 试试这门课程/书籍,这是一个很好的查询数据库的介绍。 https://www.microsoft.com/en-au/learning/exam-70-461.aspx
  5. 这是怎么回事?选择语法为Select [fieldlist] from [table] inner join [jointable] on [join fields] group by [grouping fields]。 fieldlist可以是计算以及要显示的实际字段名称。 “内部联接”意味着您只需要那些订单,订单详细信息,有实际匹配数据的员工 - 在您的方案中更正。 [table]和[jointable]是包含关系意义上的数据的实际表。
  6. 这里有很多东西值得一去学习。我将学习一些您可以谷歌的不同SQL Server查询课程。
  7. 以下是代码的修订版本:

    SELECT Employees.EmployeeID, Employees.FirstName, Employees.LastName, Sum([Order Details].UnitPrice * Quantity * (1 - Discount)) AS ExtendedPrice
    FROM Orders
    INNER JOIN  [Order Details] ON Orders.OrderID = [Order Details].OrderID
    INNER JOIN  Employees ON Orders.EmployeeID = Employees.EmployeeID
    group by Employees.EmployeeID, Employees.FirstName, Employees.LastName
    order by Employees.FirstName, Employees.LastName;