作者Litfal (Litfal)
看板Database
標題[SQL ] 在一次全表掃描中,count不同條件的欄位
時間Tue Aug 12 12:48:26 2014
資料庫名稱: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://webptt.com/m.aspx?n=bbs/Database/M.1407818909.A.731.html
1F:→ bohei: 先用CASE分成各區間,例如90~100區間1,80~89區間2 08/12 12:54
2F:→ bohei: 每筆都區分出區間後,再對分出的區間做GROUP COUNT 08/12 12:55
3F:→ Litfal: 可以耶! 那想再請教一下,如果要分別統計兩個欄位呢? 08/12 14:42
4F:→ Litfal: 例如說想一次統計學生的英文和數學分數,雖然查兩次也行 08/12 15:01
5F:→ bohei: 應該是無法,因為你那兩個成績的GROUP是不相關的 08/12 15:25
6F:→ bohei: 頂多在子查詢中先把英文跟數學的區間都分好,但在主查詢的 08/12 15:26
7F:→ bohei: 部分還是要分成兩次來查詢(GROUP) 08/12 15:26
8F:→ bohei: 你先把你想看到的結果結構畫出來吧~ 08/12 15:29
9F:→ bohei: 如果你要看到的是英文0~10/數學0~10,英文0~10/數學11~20.. 08/12 15:31
10F:→ bohei: 說不定一次GROUP就可以了 08/12 15:32
11F:→ Litfal: 感謝!之所以會有這種想法,是覺得,既然都是全表走訪一次 08/13 00:44
12F:→ Litfal: 為什麼不能多統計一些東西呢? 08/13 00:44