带联接的SQL聚合函数

时间:2018-11-25 09:56:08

标签: sql sql-server

 SELECT ORDERS.ORDERID,
        ORDERS.CUSTOMERID,
        ORDERS.EMPLOYEEID,
        ORDERDETAILS.PRODUCTID,
        ORDERDETAILS.UNITPRICE,
        ORDERDETAILS.QUANTITY,
        COUNT(ORDERS.ORDERID)
 FROM ORDERS
      LEFT JOIN ORDERDETAILS ON ORDERS.ORDERID=ORDERDETAILS.ORDERID
 GROUP BY ORDERDETAILS.ORDERID
  

错误:选择列表中的列“ ORDERS.OrderID”无效,因为它   既不包含在汇总函数中,也不包含在GROUP BY中   条款。

2 个答案:

答案 0 :(得分:0)

对于使用聚合函数,所选列还需要包含在group by子句中

SELECT 
 ORDERS.ORDERID,ORDERS.CUSTOMERID,ORDERS.EMPLOYEEID,ORDERDETAILS.PRODUCTID,ORD ERDETAILS.UNITPRICE,ORDERDETAILS.QUANTITY,
 COUNT(ORDERS.ORDERID)
 FROM ORDERS LEFT JOIN ORDERDETAILS ON 
 ORDERS.ORDERID=ORDERDETAILS.ORDERID
 GROUP BY ORDERDETAILS.ORDERID,ORDERS.CUSTOMERID,ORDERS.EMPLOYEEID,ORDERDETAILS.PRODUCTID,ORD ERDETAILS.UNITPRICE,ORDERDETAILS.QUANTITY

答案 1 :(得分:0)

大概您打算这样做:

SELECT o.ORDERID, o.CUSTOMERID, o.EMPLOYEEID,
       COUNT(od.ORDERID) as NUM_PRODUCTS
FROM ORDERS o LEFT JOIN
     ORDERDETAILS od
     ON o.ORDERID = od.ORDERID
GROUP BY o.ORDERID;

这会每ORDERID产生一行,并按每个订单计数产品的数量(或更具体地,orderdetails行)。

注意:

  • SELECT中所有未聚合的列应为GROUP BY键。
  • 您不希望在ORDERDETAILS中包括来自SELECT的未聚合列,因为那样的话ORDER可能在结果集中有多行。
  • 您确实想使用表别名,因此查询更易于编写和阅读。