获取每个订单的平均桌面数量-SQL

时间:2012-11-22 02:39:47

标签: sql

假设我有4张桌子

Order (OrderID, ComputerID, Quantity, Type_PC)
Computer (ComputerID, Model)
Desktop (ComputerID, specs, Cost)
Laptop (ComputerID, specs, Cost)

我正在尝试获取每个订单的平均桌面数量。

SELECT order.orderid, avg(order.quantity) AS AvgDesktopsSold
FROM computer, order
WHERE order.type_pc ="desktop" AND computer.computerid = order.computerid;

我的错误是Column "Desktop" not found

你能帮我解决这个SQL问题吗?

1 个答案:

答案 0 :(得分:2)

SQL标准将双引号视为包含“分隔标识符”,这意味着双引号表示内部名称是列名或表名,或其附近。你需要在字符串周围使用单引号。

许多基于Unix的DBMS对双引号中的字符串相当灵活。显然,您正在使用的那个没有,或者没有被配置为。

您还应该避免使用FROM computer, order表示法。您需要知道它存在以防您阅读真正的旧代码,但您应该始终在SQL中使用显式JOIN表示法。所以,如果你需要加入,你应该写:

SELECT order.orderid, AVG(order.quantity) AS AvgDesktopsSold
  FROM computer
  JOIN order ON computer.computerid = order.computerid
 WHERE order.type_pc = 'desktop';

您还应该使用GROUP BY子句。任何非聚合列都应该在GROUP BY子句中。

SELECT order.orderid, AVG(order.quantity) AS AvgDesktopsSold
  FROM computer
  JOIN order ON computer.computerid = order.computerid
 WHERE order.type_pc = 'desktop'
 GROUP BY order.orderid;

但是,由于您没有使用计算机表中的任何列(更不用说桌面或笔记本电脑表),您甚至不需要JOIN:

SELECT orderid, AVG(quantity) AS AvgDesktopsSold
  FROM order
 WHERE type_pc = 'desktop'
 GROUP BY orderid;

现在,这将为您提供“桌面每个订单的平均桌面数量”的答案,但该平均值也是数量。所以,你真的不需要select-list中的orderid,或者毕竟不需要GROUP BY子句:

SELECT AVG(quantity) AS AvgDesktopsSold
  FROM order
 WHERE type_pc = 'desktop';