|
楼主 |
发表于 2013-4-30 09:35
|
显示全部楼层
本帖最后由 mps777 于 2013-4-30 15:24 编辑
6、非子查询的各科排名
昨天香帅版主说过,各科排名可以用join来替代子查询得到排名;小麦想了一天,终于想出来了,生成速度很快,期待版主、各位老师指正,谢谢!
经香帅版主的指点,原代码有误,现已更正了,好像越写越长……{:soso_e109:}
数据源
六、不取用子查询的各科排名
代码:
用的是多表查询+内部查询(left join )来完成
如下是正确代码,解决出现多个最高分不是第1名的问题
- select t3.*,li.力学名次 from
- (select t2.*,se.设计名次 from
- (select t1.*,ji.机械名次 from [期中$]t1
- left join
- (select a.机械,count(*) as 机械名次 from
- (select distinct 机械 from [期中$])a,(select distinct 机械 from [期中$])b
- where a.机械<=b.机械 group by a.机械)ji on t1.机械=ji.机械)t2
- left join
- (select a.设计,count(*) as 设计名次 from
- (select distinct 设计 from [期中$])a,(select distinct 设计 from [期中$])b
- where a.设计<=b.设计 group by a.设计)se on t2.设计=se.设计)t3
- left join
- (select a.力学,count(*) as 力学名次 from
- (select distinct 力学 from [期中$])a,(select distinct 力学 from [期中$])b
- where a.力学<=b.力学 group by a.力学)li on t3.力学=li.力学
复制代码 如下是错误代码,没有解决出现最高分为第1名的问题
- select t5.*,t6.设计名次 from
- (select t3.*,t4.力学名次 from
- (select t1.*,t2.机械名次
- from [期中$]t1 left join
- (select a.姓名,count(*) as 机械名次 from [期中$]a,[期中$]b
- where a.机械<=b.机械 group by a.姓名)t2
- on t1.姓名=t2.姓名)t3 left join
- (select
- a.姓名,count(*) as 力学名次 from [期中$]a,[期中$]b where a.力学<=b.力学 group by a.姓名)t4
- on t3.姓名=t4.姓名)t5 left join
- (select a.姓名,count(*) as 设计名次 from
- [期中$]a,[期中$]b where a.设计<=b.设计 group by a.姓名)t6
- on t5.姓名=t6.姓名
复制代码 六、以学生为序,各科排名
这个是在如何用join来替代子查询的情况下,无意想到的一种结果,各位读者可以看看,不知成绩排名里有没有这种情况的。
代码:
- transform sum(设计名次)
- select 姓名,科目,成绩 from
- (select t1.姓名,'设计' as 科目,t1.设计 as 成绩,'设计名次' as 分类,ji.设计名次 from [期中$]t1
- left join
- (select a.设计,count(*) as 设计名次 from
- (select distinct 设计 from [期中$])a,(select distinct 设计 from [期中$])b
- where a.设计<=b.设计 group by a.设计)ji on t1.设计=ji.设计
- union all
- select t1.姓名,'力学',t1.力学,'力学名次' as 分类,ji.力学名次 from [期中$]t1
- left join
- (select a.力学,count(*) as 力学名次 from
- (select distinct 力学 from [期中$])a,(select distinct 力学 from [期中$])b
- where a.力学<=b.力学 group by a.力学)ji on t1.力学=ji.力学
- union all
- select t1.姓名,'机械',t1.机械,'机械名次' as 分类,ji.机械名次 from [期中$]t1
- left join
- (select a.机械,count(*) as 机械名次 from
- (select distinct 机械 from [期中$])a,(select distinct 机械 from [期中$])b
- where a.机械<=b.机械 group by a.机械)ji on t1.机械=ji.机械) group by 姓名,科目,成绩 pivot 分类
复制代码 我的数据与代码
非子查询的各科排序数据.zip
(25.64 KB, 下载次数: 313)
非子查询的各科排序代码.zip
(629 Bytes, 下载次数: 261)
谢谢大家的观看与建议,以后遇到学生成绩的一些效果且可以用SQL来完成的,小麦都会一一补充。
|
|