注册 登录
编程论坛 SQL Server论坛

png楼兄,谢谢你的指教。但你所提供的代码结果与不对

sylknb 发布于 2011-04-23 18:34, 506 次点击
png楼兄,谢谢你的指教。
我按你的代码对列名作一调正。
SELECT a.学校,a.语文,COUNT(b.语文)+1 as 名次 FROM xscj a LEFT join  xscj  b ON a.语文<b.语文 GROUP BY  a.学校,a.语文
产生结果与原表不同,如60分应排在第2位,但它排在第3位了。-60与20均为13名等见图1
如果语句改为:对语文成绩分组
SELECT a.语文,COUNT(b.语文)+1 as 名次 FROM xscj a LEFT join  xscj  b ON a.语文<b.语文 GROUP BY  a.语文
只对对语文成绩分组统计,则产生的名次号与图1不相同,出来的现象是:1、中间出现几个断档,2、又如60分应为第2位,但它排在第3位了,不知为什么?
图1[
 
只有本站会员才能查看附件,请 登录
       图2     
只有本站会员才能查看附件,请 登录
原表排序图
只有本站会员才能查看附件,请 登录

  
7 回复
#2
sylknb2011-04-25 22:05
png楼兄怎么没有回音呀
#3
png2011-04-25 23:11
不好意思,这两天没上网.

JOIN与子查询,结果应该一样. 你记得你的问题语句用的是子查询,所以猜测用JOIN换个角度看问题,也许对问题的理解有些帮助.

假如你的这张表 XSCJ 有主键"ID" - 我举的例子用了有ID列. 类似这样,应该得出你原来同样的结果

SELECT a.语文,COUNT(b.语文)+1 as 名次 FROM xscj a LEFT join  xscj  b ON a.语文<b.语文
GROUP BY  a.ID, a.语文

针对你的问题,
1、中间出现几个断档. 这是因为130分排名第一,2个60分排名并列第二,30分正好排第四. 我给你的例子好象也是类似的情况.



[ 本帖最后由 png 于 2011-4-25 23:47 编辑 ]
#4
png2011-04-25 23:37
又看了下,因为有类似重复记录

学校  班级       语文
一中  1班        20
一中  1班        20
一中  199班      60
一中  199班      60

所以不能用-
GROUP BY  a.学校,a.语文
GROUP BY  a.语文
GROUP BY  a.学校,a.班级,a.语文


[ 本帖最后由 png 于 2011-4-25 23:46 编辑 ]
#5
sylknb2011-04-26 18:33
png;楼兄

数据庫没有id 主鍵
1。如不用 rgoup by 语句,就出来提示sql rgoup by 缺少或无效

SELECT a.语文,COUNT(b.语文)+1 as 名次 FROM xscj a LEFT join  xscj  b ON a.语文<b.语文

2。如用GROUP BY  a.语文,出来的名次号不对

SELECT a.语文,COUNT(b.语文)+1 as 名次 FROM xscj a LEFT join  xscj  b ON a.语文<b.语文 GROUP BY  a.语文
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录


[ 本帖最后由 sylknb 于 2011-4-26 18:35 编辑 ]
#6
png2011-04-27 03:09
没有主鍵又有重复记录, 那样的话不适合用GROUP BY得到你要的排序.

你原来的语句 -

SELECT 语文, (SELECT COUNT(*)+1 FROM xscj.dbf WHERE a.语文< 语文) AS 语文名次 FROM xscj.dbf AS a

并没有错误, 应该是很好的办法了.

#7
sylknb2011-04-27 18:34
谢谢您的指教。问题是不理介他的代码。
下述理介不知对否?请明示,谢谢!
1、a.语文是查询结果表FROM xscj.dbf AS a 中的列名,语文是原xscj.dbf的列名
2、SELECT 语文, (SELECT COUNT(*)+1 FROM xscj.dbf WHERE a.语文< 语文) AS 语文名次 FROM xscj.dbf AS a
用红色表示的是查询结果后表(2.JPG),用兰色表示的是原成绩表(1.jpg)。是把一个表好象分成实表与虚拟表(查询)。
只有本站会员才能查看附件,请 登录
   
只有本站会员才能查看附件,请 登录
#8
png2011-04-29 00:16
1、a.语文是查询结果表FROM xscj.dbf AS a 中的列名,语文是原xscj.dbf的列名

YES.

2、SELECT 语文, (SELECT COUNT(*)+1 FROM xscj.dbf WHERE a.语文< 语文) AS 语文名次 FROM xscj.dbf AS a
用红色表示的是查询结果后表(2.JPG),用兰色表示的是原成绩表(1.jpg)。是把一个表好象分成实表与虚拟表(查询)。

NO. 红,兰色的 xscj.dbf 说的都是同一张原成绩表(1.jpg).
1