2012-11-22 26 views
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

使用单引号“桌面”,而不是双引号。双引号使其被解释为列名。 – GreyBeardedGeek

+1

'order'是一个关键的sql字,我强烈建议将表名更改为其他名称以帮助查询查询的可读性。 – Tigger

+0

每个订单只能有一种类型的PC?这似乎是错误的。如果有人想要订购两台笔记本电脑和两台台式电脑怎么办?你将不得不创建两个订单。当你开始销售笔记本时,你必须创建一个新表。 –

回答

2

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

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

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

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; 

然而,当你不使用从电脑桌的任何列(更不用说台式机或笔记本表),你甚至都不需要连接:

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';