2010-06-15 21 views
1

我對SQL查詢有點新,而且我正在爲這個特定問題而苦苦掙扎。 比方說,我已經查詢返回下面3條記錄(保存爲簡單一列):
湯姆
傑克
湯姆通過它們的出現比例檢索名稱

而且我希望有由名稱分組的結果,也包括部分(比例)該名稱出現在返回的總記錄中。

所以,期望的結果將是(如兩列):
Tom | 2/3
Jack | 1/3

我該怎麼辦?確定分子非常簡單(我可以使用COUNT()和GROUP BY名稱),但是我無法將其轉換爲返回總行數中的比例。

任何幫助非常感謝!

回答

3
SELECT name, COUNT(name)/(SELECT COUNT(1) FROM names) FROM names GROUP BY name; 
+0

那麼,在我的情況下,「名稱」部分實際上是它自己的長查詢。我必須複製並粘貼整個子查詢才能在通用查詢中出現兩次嗎?或者有什麼辦法可以做到:「SELECT name,COUNT(name)/(SELECT COUNT(1)FROM(SELECT ...)AS my_subquery)FROM my_subquery GROUP BY name;」 ?如果有,我似乎無法得到正確的語法。 – 2010-06-15 22:13:21

+0

此外,您提供的查詢結構工作,但我不得不將「COUNT(1)」更改爲「CAST(COUNT(1)AS float」,否則它會進行整數除法並返回全零。 – 2010-06-15 22:37:21

1

由於分母是固定的,「比例」與分子成正比。除非你真的需要顯示分母,這將是一個容易得多,只是使用類似:

select name, count(*) from your_table_name 
group by name 
order by count(*) desc 

,你會得到正確的順序正確的數據,但是這顯示的數字會是計數而不是比率。

如果你真的想要這個分母,你可以在同一個select的非分組版本上做count(*) - 但是取決於選擇需要多長時間,這可能會很慢。

+0

那麼,我想要的比例,而不是純粹的計數的原因是因爲我使用我的數據過濾器。也就是說,如果它只佔返回記錄的一半以上,我只想返回「湯姆」。否則,我認爲它只是噪音。有沒有更好的方法來解決這個問題?也許我應該在我的應用程序代碼中這樣做? – 2010-06-15 22:25:33

+0

@jjiffer:或許一個近似的答案會很有用?只有*一個*組可能構成超過一半的記錄,所以也許你可以返回最高記錄的記錄?這不一定會超過記錄的一半,但也許它足夠接近您的目的? – 2010-06-15 23:53:53

+0

這是一個很好的觀點,但如果沒有答案「足夠令人信服」,我也可以選擇不做任何回答。我可能會稍微調整一下,比較計算時間和使用粗糙逼近的準確性,並看看未來會出現什麼技術。謝謝你的幫助! – 2010-06-16 13:44:20

相關問題