2012-11-22 16 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';