我在SQLZOO上練習SQL,我正在練習連接。該部分的問題11問道。"對于涉及'POL'的每場比賽,顯示比賽編號、日期和進球數。
因此,我嘗試了以下代碼:
SELECT matchid, mdate, COUNT(player)
FROM goal JOIN game ON matchid = id
WHERE (team1 = 'POL' OR team2 = 'POL')
GROUP BY matchid
但是它拋出了一個錯誤:
'gisq.game.mdate'不在GROUP BY中
所以答案是:
SELECT matchid, mdate, COUNT(player)
FROM goal JOIN game ON matchid = id
WHERE (team1 = 'POL' OR team2 = 'POL')
GROUP BY matchid, mdate
我的問題是,如果mdate不是聚合函式的一部分,為什么還需要在GROUP BY子句中包含它?謝謝你,對不起,我的問題是新手問題。以下是表格的格式。https://sqlzoo.net/wiki/The_JOIN_operation
uj5u.com熱心網友回復:
之所以需要這樣做,原因很簡單,因為SQL要求GROUP BY列和SELECT列需要兼容。 這些都是語言的規則。
你的查詢稍微簡化了一下。
你的查詢稍微簡化了一下是:
SELECT matchid, mdate, COUNT(player)
FROM goal JOIN
游戲
ON matchid = id
WHERE 'POL' IN (team1, team2)
GROUP BY matchid。
查詢是說。 每個matchid回傳一條記錄 -- 因為有GROUP BY。 但是哪個mdate會被回傳? 可能有多個匹配。
SQL要求你明確說明你想要什么。 你可能想得到最近的日期,在這種情況下,你將使用MAX(mdate)。 或者您可能希望每個日期都有一個單獨的行,在這種情況下,您將在GROUP BY中包含它。 或者你可能想做別的事情。 該查詢需要明確。
uj5u.com熱心網友回復:
Group By single column。Group By單列意味著,將所有與該特定列數值相同的行放在一個組中。
按多列分組。按多列分組,例如,GROUP BY column1, column2。這意味著將所有與列1和列2的值相同的行放在一個組中
既然問題是這樣的,那么我們就應該把這些行放在一個組中。
由于問題要求你同時選擇日期,你必須把它放在group by子句中,讓我們假設如果POL在同一日期有多場比賽怎么辦。在groupby子句中保留日期可以幫助你處理這種情況。
uj5u.com熱心網友回復:
當在查詢的SELECT部分與直接(非聚合)列一起使用聚合和聚合函式(COUNT、MAX、MIN、AVG等)時,必須在查詢的GROUP BY部分重復SELECT部分中所有未聚合的列。結果,這也是我們所需要的,所有的列都被聚合了,其中一些是通過查詢的SELECT部分的聚合函式聚合的,其余的是在GROUP BY子句中聚合的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/323107.html
標籤:
