[SQL ] 在一次全表掃描中,count不同條件的欄位

看板Database作者 (Litfal)時間9年前 (2014/08/12 12:48), 編輯推噓0(0012)
留言12則, 2人參與, 最新討論串1/2 (看更多)
資料庫名稱:SQL Server 資料庫版本:均可 內容/問題描述: 有辦法在一次Table scan中,就做掉多個條件欄位的統計嗎? 例如,我要統計某次考試中,每個分數區間的總人數, 如 60~69、70~79、80~89、90~100 區間的個別人數。 邏輯上來說應該掃一次、分別統計就夠了。 但SQL語法我只能寫成4次的table scan,像這樣 SELECT( SELECT COUNT(*) FROM [Test] WHERE [Test].[Score] >= 90 && [Test] <= 100) AS [Up90Count], SELECT COUNT(*) FROM [Test] WHERE [Test].[Score] >= 80 && [Test] < 90) AS [Up80Count], (略) 這樣是跑4個table scan。 當然可以把Score加Index,但因為這邊舉的只是最簡單的例子。 有時情況並不能把所有條件參數都Index。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.135.179.10 ※ 文章網址: http://www.ptt.cc/bbs/Database/M.1407818909.A.731.html

08/12 12:54, , 1F
先用CASE分成各區間,例如90~100區間1,80~89區間2
08/12 12:54, 1F

08/12 12:55, , 2F
每筆都區分出區間後,再對分出的區間做GROUP COUNT
08/12 12:55, 2F

08/12 14:42, , 3F
可以耶! 那想再請教一下,如果要分別統計兩個欄位呢?
08/12 14:42, 3F

08/12 15:01, , 4F
例如說想一次統計學生的英文和數學分數,雖然查兩次也行
08/12 15:01, 4F

08/12 15:25, , 5F
應該是無法,因為你那兩個成績的GROUP是不相關的
08/12 15:25, 5F

08/12 15:26, , 6F
頂多在子查詢中先把英文跟數學的區間都分好,但在主查詢的
08/12 15:26, 6F

08/12 15:26, , 7F
部分還是要分成兩次來查詢(GROUP)
08/12 15:26, 7F

08/12 15:29, , 8F
你先把你想看到的結果結構畫出來吧~
08/12 15:29, 8F

08/12 15:31, , 9F
如果你要看到的是英文0~10/數學0~10,英文0~10/數學11~20..
08/12 15:31, 9F

08/12 15:32, , 10F
說不定一次GROUP就可以了
08/12 15:32, 10F

08/13 00:44, , 11F
感謝!之所以會有這種想法,是覺得,既然都是全表走訪一次
08/13 00:44, 11F

08/13 00:44, , 12F
為什麼不能多統計一些東西呢?
08/13 00:44, 12F
文章代碼(AID): #1JwPoTSn (Database)
文章代碼(AID): #1JwPoTSn (Database)