简体   繁体   English

选择 SUM,连接两个表,在 SQL 查询中按 OrderID 对总和进行分组

[英]Select SUM, Join two tables, group sum by OrderID in SQL Query

Currently trying to solve the reason for this error:目前正在尝试解决这个错误的原因:

Column 'Orders.OrderID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.列“Orders.OrderID”在选择列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中。

My goal is to group all the quantities for the items in each order ID, from the Order Details table我的目标是从Order Details表中对每个订单 ID 中的项目的所有数量进行分组

The SQL Server database I'm using is open to the public, as part of W3School's website tools.我使用的 SQL Server 数据库是对公众开放的,作为 W3School 网站工具的一部分。 View it here if you'd like to test your query results: https://www.w3schools.com/sql/trysqlserver.asp?filename=trysql_func_sqlserver_datepart如果您想测试查询结果,请在此处查看: https ://www.w3schools.com/sql/trysqlserver.asp?filename=trysql_func_sqlserver_datepart

I appreciate any help, and please let me know if you need more context/information to help me out.感谢任何帮助,如果您需要更多上下文/信息来帮助我,请告诉我。 Thanks!谢谢!

PS: please pardon my messy code, new to SQL:) PS:请原谅我乱七八糟的代码,SQL新手:)

What I have so far:到目前为止我所拥有的:

SELECT 
    O.OrderID,
    YEAR(O.OrderDate) AS OrderYear,
    DATEPART(qq, O.OrderDate) AS OrderQuarter,
    CONCAT(E.FirstName, SPACE(1), E.LastName) AS EmployeeName,
    C.CustomerName,
    S.ShipperName,
    SUM(D.Quantity) AS OrderItems
FROM
    ((((Orders AS O
JOIN 
    Employees AS E ON O.EmployeeID = E.EmployeeID)
JOIN 
    Customers AS C ON O.CustomerID = C.CustomerID)
JOIN 
    Shippers AS S ON O.ShipperID = S.ShipperID)
JOIN 
    OrderDetails AS D ON O.OrderID = D.OrderID);

What I'm trying to achieve: my mentor gave me a small sample image to reference from.我想要实现的目标:我的导师给了我一张小样本图片作为参考。 This is how I want to print out the quantities in my query with the column name OrderItems这就是我想使用列名OrderItems在查询中打印数量的方式

参考

If you remove the SUM function from SELECT , and remove the last join table statement, you'll see my query aggregates everything correctly up until OrderItems just fine.如果您从SELECT中删除SUM函数,并删除最后一个连接表语句,您将看到我的查询正确地聚合了所有内容,直到OrderItems就好了。 I have yet to add the OrderRevenue column and order it by descending Revenue value, but big brownie points if you want to go the extra mile and explain how to solve that as well.我还没有添加OrderRevenue列并通过递减Revenue值对其进行排序,但是如果您想更进一步并解释如何解决该问题,请加分。

Using the example data you provided through w3c:使用您通过 w3c 提供的示例数据:

SELECT o.OrderID, DATEPART(YEAR,o.OrderDate) AS OrderYear, DATEPART(QUARTER,o.OrderDate) AS OrderQuarter,
       E.FirstName + ' ' + E.LastName AS EmployeeName, C.CustomerName, S.ShipperName, SUM(d.Quantity) AS Quantity--, SUM(d.Quantity*d.Price) AS OrderRevenue
  FROM Orders o
    INNER JOIN Employees e
      ON o.EmployeeID = e.EmployeeID
    INNER JOIN Customers c
      ON o.CustomerID = c.CustomerID
    INNER JOIN Shippers s
      ON o.ShipperID = s.ShipperID
    INNER JOIN OrderDetails d
      ON o.OrderID = d.OrderID
 GROUP BY o.OrderID, DATEPART(YEAR,o.OrderDate), DATEPART(QUARTER,o.OrderDate),
       E.FirstName + ' ' + E.LastName, C.CustomerName, S.ShipperName
OrderID OrderYear   OrderQuarter    EmployeeName        CustomerName            ShipperName     Quantity
--------------------------------------------------------------------------------------------------------
10249   1996        3               Michael Suyama      Tradicao Hipermercados  Speedy Express  49
10250   1996        3               Margaret Peacocl    Hanari Carnes           United Package  60
10368   1996        4               Andrew Fuller       Ernst Handel            United Package  78
10389   1996        4               Margaret Peacock    Bottom-Dollar Marketse  United Package  81
10418   1996        1               Margaret Peacock    QUICK-Stop              Speedy Express  146
10442   1997        1               Janet Leaverling    Ernst Handel            United Package  170

Your syntax error was because you did not define a GROUP BY and reference the columns which you wanted to aggregate to.您的语法错误是因为您没有定义 GROUP BY 并引用要聚合到的列。 When you use an aggregate function (like SUM or COUNT ) you must also tell the engine which columns you will be grouping by.当您使用聚合函数(如SUMCOUNT )时,您还必须告诉引擎您将根据哪些列进行分组。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM