2015-08-23 34 views
0

這是一個視圖,顯示每個強盜,他們在監獄裏的年數,所犯的搶劫數量和他們的總收入(21行)。爲什麼HAVING col> AVG(col)沒有返回行?

ActiveRobbers2 View

然後我想創建另一個視圖上面的觀點,以進一步處理數據。我希望我的新視角只顯示劫匪的綽號,他們的NoYears(監獄服役)= 0,其NoRobberies大於平均搶劫數量。

CREATE VIEW ActiveRobbers3 
AS 
SELECT Nickname 
FROM ActiveRobbers2 
WHERE NoYears = 0 
GROUP BY Nickname, NoRobberies 
HAVING NoRobberies > AVG(NoRobberies); 

但是,當我嘗試SELECT * FROM ActiveRobbers3時,這不會返回任何行。誰能看到我的問題?乾杯

+2

avg(NoRobberies)將始終等於此組中的NoRobberies。也請刪除一些標籤(這是mysql或postgresql?) – amdixon

+0

我不得不在我的GROUP BY子句中包含NoRobberies,但是不是嗎?通常我會使用WHERE,但是我不能在where子句中使用聚合函數。 – Rothmanberger

+1

聚合時,非聚合必須在組中 - 是的。儘管你需要做一些查詢並將它們結合在一起來處理這樣一個事實,即你希望所有劫匪的平均值不是每個劫匪的平均值(它總是等於劫匪的數據,因爲每個盜賊似乎有一排) – amdixon

回答

3

你的問題是模糊的。跨表格的所有數據或與特定「暱稱」有關的數據的平均值爲NoRobberies

案例1:在所有數據

CREATE VIEW ActiveRobbers3 
AS 
SELECT Nickname 
FROM ActiveRobbers2 
WHERE NoYears = 0 
AND NoRobberies > (select AVG(NoRobberies) from ActiveRobbers2); 

案例2的NoRobberies平均:中NoRobberies平均爲各自的綽號 「暱稱」

CREATE VIEW ActiveRobbers3 
AS 
SELECT Nickname,NoRobberies 

FROM ActiveRobbers2 
WHERE NoYears = 0 
GROUP BY Nickname 
Having NoRobberies > AVG(NoRobberies); 

注:案例2會給數據只有一個暱稱擁有至少兩行不同的NoRobberies。示例代碼爲MySQL

+1

有[小提琴](http://sqlfiddle.com/#!9/309ba/1) – amdixon

+0

對不起,我指的是情況1。感謝您的雙重答覆! – Rothmanberger

+0

在第二種情況下將選擇哪個NoRobberies值?第二種情況會產生不一致的結果。 – zerkms

0

也許這個作品:

CREATE VIEW ActiveRobbers3 
AS 
SELECT Nickname 
FROM ActiveRobbers2, 
(SELECT AVG(AVG_NoRobberies) as AVG_NoRobberies FROM ActiveRobbers2) as b 
WHERE NoYears = 0 
AND NoRobberies > b.AVG_NoRobberies 
+0

'錯誤:列「avg_norobberies」不存在位置:51' – zerkms

相關問題