[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