2

假设我有 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 问题吗?

4

1 回答 1

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;

但是,由于您没有使用 Computer 表中的任何列(更不用说 Desktop 或 Laptop 表),因此您甚至不需要 JOIN:

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

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

SELECT AVG(quantity) AS AvgDesktopsSold
  FROM order
 WHERE type_pc = 'desktop';
于 2012-11-22T04:13:26.693 回答