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

作者: Litfal (Litfal)   2014-08-12 12:48:26
資料庫名稱: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。
作者: bohei (run and fall)   2014-08-12 12:54:00
先用CASE分成各區間,例如90~100區間1,80~89區間2每筆都區分出區間後,再對分出的區間做GROUP COUNT
作者: Litfal (Litfal)   2014-08-12 14:42:00
可以耶! 那想再請教一下,如果要分別統計兩個欄位呢?例如說想一次統計學生的英文和數學分數,雖然查兩次也行
作者: bohei (run and fall)   2014-08-12 15:25:00
應該是無法,因為你那兩個成績的GROUP是不相關的頂多在子查詢中先把英文跟數學的區間都分好,但在主查詢的部分還是要分成兩次來查詢(GROUP)你先把你想看到的結果結構畫出來吧~如果你要看到的是英文0~10/數學0~10,英文0~10/數學11~20..說不定一次GROUP就可以了
作者: Litfal (Litfal)   2014-08-13 00:44:00
感謝!之所以會有這種想法,是覺得,既然都是全表走訪一次為什麼不能多統計一些東西呢?

Links booklink

Contact Us: admin [ a t ] ucptt.com