2017-10-17 260 views
0

enter image description hereSQL的分組平均數

嗨!我是SQL新手我無法正確使用avg和sum函數。我正在處理上面的數據庫。我需要找到的平均利潤爲每個影星,但只只輸出平均,如果他們的利潤總和爲> 200

SELECT MovieStar.sname, avg(profit) From MovieStar, Movie 
GROUP BY sname 
HAVING sum(Movie.profit) > 200 

我使用SQL小提琴,試圖弄清楚這一點,但它似乎要返回整個利潤列的平均值,而不是每個演員,但我不知道我會做錯什麼。我該如何解決這個問題,以便我可以得到每個演員的平均值,而不是整個利潤列的平均值? Here是我提出的SQL小提琴。提前致謝!

+0

你應該演員組嗎?如果您只是使用運行平均值,請查看窗口函數。 –

+0

是不是'GROUP BY sname'所做的?按名稱分組? – helloworld

+0

您沒有連接條件,也沒有實際的現代JOIN;所以每個明星都會與每部**電影配對。 – Uueerdo

回答

3

看起來像查詢正在進行CROSS JOIN操作,一個笛卡爾產品,將每部電影匹配到每個電影明星。似乎我們只想將電影明星匹配到特定的電影,可能使用(包括)starsin表格來獲得匹配。

我建議你把舊的逗號運算符連接起來。改爲使用更新的JOIN關鍵字。並將連接謂詞放在適當的ON子句中而不是WHERE子句中。

此外,最佳實踐是限定全部列引用;即使不需要消除歧義,它也可以防止在添加新列時查詢中斷,並且有助於未來的讀者......可憐的靈魂必須查看錶定義來確定哪些柱來自哪個表。

我想你想是這樣的:

SELECT ms.sname 
-- , ms.sno 
     , AVG(m.profit) AS avg_profit 
-- , SUM(m.profit) AS tot_profit 
    FROM MovieStar ms 
    JOIN StarsIn si 
     ON si.sno = ms.sno 
    JOIN Movie m 
     ON m.mno = si.mno 
    GROUP BY ms.sno, ms.sname 
    HAVING SUM(m.profit) > 200 
    ORDER BY AVG(m.profit) DESC 
+0

事實上,這正是爲什麼隱式連接要避免,因爲你可以[錯誤地運行交叉連接](https://stackoverflow.com/a/317465/1422451)與OP一樣。 – Parfait

+0

謝謝你們兩位!我不知道交叉連接操作可能會發生,但這是有道理的。在這種情況下,我可以問你爲什麼選擇使用ON而不是WHERE嗎?在我看來,他們看起來是一樣的,至少是密切相關的。 – helloworld

+0

我寧願將行「匹配」的條件放入ON子句中,並將其他條件放入WHERE子句中。這不是要求,MySQL不關心。這只是一種風格習慣,一種偏好。我認爲當查詢連接八個表時,讀者會更容易在ON子句中獲得條件,而不是讓讀者篩選WHERE子句中的所有條件。在ON子句中具有條件也使得我們在執行OUTER JOIN時更容易。 – spencer7593