作者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/cn.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