|
分段或者交叉统计的查询语句怎么写?
作者:cg1 摘自:access911.net 编辑:cg1 更新日期:2006-3-10 浏览人次: 20
专题地址:
http://access911.net/?kbid;72FAB11E1BDCEDF3
简述:
分段或者交叉统计的查询语句怎么写?《查询》
阅读前需掌握:
难度等级:
10
   
   

问题:
现在有一个表,结构如下:
姓名 班级 科目 分数 王五 初一3班 语文 70 王五 初一3班 数学 80 王五 初一3班 英语 50 周天 初一3班 数学 100 李小 初一2班 语文 99 李小 初一2班 物理 100
想用 JET SQL 语句生成类似以下结构的结果,如何生成?
班级 科目 总分 不及格人次 60到80分人次 80到90分人次 90到100分人次
回答:
虽然文字很多,但是并不复杂,请认真仔细查看 上述情况的特点是分段不均匀且可能分段段数很多,比如 60-70 70-80 80-90 90-95 95-100。可以使用 access中的 IIF 和 SWITCH 来实现,但是 access911 推荐使用 jet sql 分步来实现。
首先获取第一段的人次(不及格人次)
select 姓名,班级,科目,分数,1 as 不及格人次 from 表 where 分数< 60
但是这样只有一个列显示不及格人次,其他人次没办法显示,其实只要使用一个简单的技巧就可以得到其他列,我们可以用一个固定的数字代表其他列,比如 0
select 姓名,班级,科目,分数,1 as 不及格人次,0 as 60到80分人次,0 as 80到90分人次,0 as 90到100分人次 from 表 where 分数< 60
然后获得获取第二段的人次(60到80分人次)
select 姓名,班级,科目,分数,0 as 不及格人次,1 as 60到80分人次,0 as 80到90分人次,0 as 90到100分人次 from 表 where 分数>=60 and 分数< 80
注意上述语句将固定值“1”移到了“60到80分人次”列,其他列都用固定值“0”代替 好了,这样我们已经得到了两个分段,如何将其组合在一起呢?用 JET SQL 的 UNION ALL 就可以了
select 姓名,班级,科目,分数,1 as 不及格人次,0 as 60到80分人次,0 as 80到90分人次,0 as 90到100分人次 from 表 where 分数< 60 union all select 姓名,班级,科目,分数,0 as 不及格人次,1 as 60到80分人次,0 as 80到90分人次,0 as 90到100分人次 from 表 where 分数>=60 and 分数< 80
好了,再用同样的原理我们获取所有分段
select 姓名,班级,科目,分数,1 as 不及格人次,0 as 60到80分人次,0 as 80到90分人次,0 as 90到100分人次 from 表 where 分数< 60 union all select 姓名,班级,科目,分数,0 as 不及格人次,1 as 60到80分人次,0 as 80到90分人次,0 as 90到100分人次 from 表 where 分数>=60 and 分数< 80 union all select 姓名,班级,科目,分数,0 as 不及格人次,0 as 60到80分人次,1 as 80到90分人次,0 as 90到100分人次 from 表 where 分数>=80 and 分数< 90 union all select 姓名,班级,科目,分数,0 as 不及格人次,0 as 60到80分人次,0 as 80到90分人次,1 as 90到100分人次 from 表 where 分数>=90 and 分数<=100
执行结果如下:
姓名 班级 科目 分数 不及格人次 60到80分人次 80到90分人次 90到100分人次 王五 初一3班 语文 70 &n [1] [2] 下一页 |