2017-08-09 249 views
3

是否可以列出僅包含唯一海岸和區域的城市名稱? (即,存在在相同的海岸和區域中的多個城市中,因此它們應當被排除)SQL GROUP BY兩個不同的組

實施例:

TABLE_NAME = MAP 
City  Coast  Region 
New York East  1 
Buffalo  East  1 
LA   West  2 
Seattle  West  1 
San Jose West  3 
Florida  East  4 
Boston  East  2 
San Diego West  2 

在本例中,我想輸出是:

Seattle 
San Jose 
Florida 
Boston 

紐約和布法羅省略,因爲他們共享相同的海岸和地區,就像洛杉磯和聖地亞哥一樣。

我想:

SELECT DISTINCT COAST, REGION 
FROM MAP 

這給了我的成本和地區,而不是城市的名稱。

我想:

SELECT CITY 
FROM MAP 
GROUP BY COAST, REGION 

但它給了我一個錯誤(請參閱下面的錯誤)。

感謝您的幫助!

編輯: 我試着添加HAVING子句,但它仍然給我與以前相同的錯誤。這是我的錯誤:

錯誤1055(42000); SELECT列表的表達式#1不在GROUP BY子句中,並且包含非聚集列run_iu98jon.MAP.CITY,它在功能上不依賴於GROUP BY子句中的列;這與sql_mode = only_full_group_by不兼容

+0

錯誤可能是您在上面的上一個查詢中拼寫錯誤「COAST」。如果您正確拼寫COAST,則會返回所有不同的城市名稱,但不會引發錯誤。 –

回答

4

你已經非常接近了,你只需要一個HAVING子句,它就像是一個WHERE子句,用於分組彙總指標。

SELECT CITY 
FROM MAP 
GROUP BY COAST, REGION 
HAVING COUNT(*) = 1; 


編輯:下面是SQL小提琴鏈接: http://sqlfiddle.com/#!9/8da83b/2/0


編輯3:這似乎是不必要的複雜,但它的工作原理和使用沒有任何分組域避免。

SELECT City 
FROM Map 
INNER JOIN (
    SELECT Coast, Region, COUNT(*) as RowCount 
    FROM Map 
    GROUP BY Coast, Region 
) AS CoastRegion ON 
    Map.Coast = CoastRegion.Coast AND 
    Map.Region = CoastRegion.Region 
WHERE 
    CoastRegion.RowCount = 1 

另外,使用StackOverflow來解決你的HackerRank問題似乎很愚蠢。我將此作爲學習練習;)

+0

我試着添加HAVING子句,它仍然給我錯誤: ERROR 1055(42000); SELECT列表的表達式#1不在GROUP BY子句中,並且包含非聚集列run_iu98jon.MAP.CITY,它在功能上不依賴於GROUP BY子句中的列;這與sql_mode = only_full_group_by – dd483pe

+0

不兼容您正在使用哪個版本的MySQL? –

+0

不確定它是什麼版本。只需從hackerrank在線進行一些練習即可。 – dd483pe