2011-11-14 73 views
1

試圖從sql zoo解決一些疑問練習SQL技能SQL實踐查詢問題

我有一個表nobel與這對誰已經在一年中贏得了崇高的獎項給定主題的人的信息列(year, subject, winner)

所以我假設主鍵是(year, subject, winner)的合成。

我想解決的問題是:顯示贏得多個主題的獲勝者。

SQL查詢的輸出應該只有一列有贏家名稱。

我覺得我應該使用group by並使用having(count(winner)) >1。但我認爲我需要按主題分組,這就是我的問題所在。

我不是在尋找一個查詢。如果你能爲我提供比查詢更多的邏輯,那將會有所幫助。也不用擔心需要實施的數據庫。我只是在練習這些問題。

+0

爲什麼downvote這個?這是一個很好的問題。 –

回答

2

這應該給你誰在多少年多贏得不同科目人:

SELECT winner 
FROM nobel 
GROUP BY winner 
HAVING COUNT(DISTINCT subject) > 1 

對於一個特定的一年中,只需添加WHERE year = <whatever>(或GROUP BY year所有年份),儘管歷史上沒有人在一年內獲得過兩個科目的諾貝爾獎 - 但是誰知道未來會帶來什麼;)

+0

忘了獨特的操作員!謝謝 – Barry

+0

爲什麼省略了一些?試試這個:'選擇冠軍,主題,從諾貝爾獎得主計數(主題)> 1',你會看到還有很多人(例如:紅十字國際委員會贏得了3個和平獎)。但它仍然只顯示2條記錄!我知道你的解決方案通過sqlzoo測試,但它實際上是正確的答案? –

+0

@ShripadKrishna您的選擇列表中的非聚合字段不會被GROUP BY完全覆蓋。 –

1

您應該考慮在本地機器上創建一個SQLiteMySQL數據庫,以便練習查詢。

主鍵與您的問題無關,請不要擔心。

您正在考慮沿着正確的路線 - 您需要一個group byhaving子句。如果您按冠軍進行分組,那麼您提出的查詢應該可以工作。我已經添加了一些勝利。

select 
    winner, count(winner) as wins 
from 
    nobel 
group by winner 
having (count(winner)) > 1 
+0

該查詢沒有給出正確的結果。 http://sqlzoo.net/2b.htm#4c – PleaseStand

+0

試試贏家組。 –

+0

哎呀,很好的電話,@SteveWellens。固定。 – ObscureRobot

0
SELECT winner 
FROM nobel 
GROUP BY winner 
HAVING COUNT(winner) > 1 

這是最簡單的方法......

+1

不幸的是,這不會起作用,因爲它不檢查贏家是否有多個主題中的一個,只是他們贏了多次。 – GavinCattell