| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6228 人关注过本帖, 2 人收藏
标题:vfp用sql如何取出每个班中的前3名
只看楼主 加入收藏
djszyyc
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2013-3-17
结帖率:75%
收藏(2)
已结贴  问题点数:20 回复次数:49 
vfp用sql如何取出每个班中的前3名
有一张表cj.dbf,内容如下
班别 姓名 成绩
01  张一 90
01  张二 89
01  张三 78
01  张四 70
02  李一 98
02  李二 97
02  李三 92
02  李四 90
02  李五 89
03  王一 90
03  王二 89
03  王三 88
03  王四 87
要求是用SQL取出每班的前3名,结果如下,如何实现?
01  张一 90
01  张二 89
01  张三 78
02  李一 98
02  李二 97
02  李三 92
03  王一 90
03  王二 89
03  王三 88

搜索更多相关主题的帖子: 如何 9001 张一 
2013-03-17 12:13
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:3 
前三名和前三个人概念是不一样的。
成绩可能有并列的,前三名最少是三个人,也可能是4个人,如果第一名有4个怎么办
2013-03-17 12:17
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
非要这样取,请上传数据表
2013-03-17 12:18
djszyyc
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2013-3-17
收藏
得分:0 
如果有并列的,只取前三位,数据表如下所示。
vfp用sql如何取出每个班中的前3名
 有一张表cj.dbf,内容如下
 班别 姓名 成绩
 01  张一 90
 01  张二 89
 01  张三 78
 01  张四 70
 02  李一 98
 02  李二 97
 02  李三 92
 02  李四 90
 02  李五 89
 03  王一 90
 03  王二 89
 03  王三 88
 03  王四 87
要求是用SQL取出每班的前3名,结果如下,如何实现?
 01  张一 90
 01  张二 89
 01  张三 78
 02  李一 98
 02  李二 97
 02  李三 92
 03  王一 90
 03  王二 89
 03  王三 88
 在其它的数据库语言中SQL很好实现,但在VFP中似乎不行,请求帮助哈
2013-03-17 13:25
djszyyc
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2013-3-17
收藏
得分:0 
这个问题我想了很久,也在网上找了很长时间,就是没有关于VFP用SQL能解决的
2013-03-17 13:44
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:3 
已经研究出来代码,可以实现并列名次的情况(有多少,出多少):
图片附件: 游客没有浏览图片的权限,请 登录注册

图中打框处就是三个班前三名中的重复人选。
程序代码:
SELECT 班别,姓名,成绩 FROM T1 ;
   JOIN (SELECT 班别 班级1,MAX(成绩) 成绩1 ;
             FROM T1 GROUP BY 班级1) T2 ;
      ON 班别=班级1 AND 成绩=成绩1 ;
UNION ALL ;
SELECT 班别,姓名,成绩 FROM T1 ;
   JOIN (SELECT 班别 班级2,MAX(成绩) 成绩2 ;
            FROM T1 ;
               JOIN (SELECT 班别 班级1,MAX(成绩) 成绩1 ;
                        FROM T1 GROUP BY 班级1) T2 ;
                  ON 班别=班级1 AND 成绩<成绩1 ;
            GROUP BY 班别) T3 ;
      ON 班别=班级2 AND 成绩=成绩2 ;
UNION ALL ;
SELECT 班别,姓名,成绩 FROM T1 ;
   JOIN (SELECT 班别 班级3,MAX(成绩) 成绩3 ;
            FROM T1 ;
               JOIN (SELECT 班别 班级2,MAX(成绩) 成绩2 ;
                        FROM T1 ;
                           JOIN (SELECT 班别 班级1,MAX(成绩) 成绩1 ;
                                    FROM T1 GROUP BY 班级1) T2 ;
                              ON 班别=班级1 AND 成绩<成绩1 ;
                        GROUP BY 班别) T3 ;
                  ON 班别=班级2 AND 成绩<成绩2 ;
            GROUP BY 班别) T4 ;
      ON 班别=班级3 AND 成绩=成绩3 ;
   ORDER BY 班别,成绩 DESC,姓名
基本思路是:先取三个班中第1名的学生;再利用连接排除掉最高分,剩下的最高分就是第2名;同理,再利用连接排除掉1、2位的最高分,剩下的最高分就是第3名。由于实现过程比较复杂,建议只查询前三名即可,越到后面代码越复杂,越看不懂。

收到的鲜花
  • tlliqi2013-03-17 16:42 送鲜花  20朵   附言:谢谢
2013-03-17 15:17
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:3 
如果有并列的,只取前三位

CLOSE DATABASES
USE cj IN 0
SELECT * FROM cj INTO CURSOR 查询结果表 READWRITE WHERE .f.
SELECT distinct 班别 FROM CJ INTO CURSOR cj_tmp2
SELECT cj_tmp2
SCAN
    INSERT INTO 查询结果表  (班别,姓名,成绩) SELECT TOP 3 班别,姓名,成绩 FROM cj WHERE 班别==cj_tmp2.班别 ORDER BY 成绩 DESC
ENDSCAN
SELECT 查询结果表
BROWSE
CLOSE DATABASES
收到的鲜花
  • djszyyc2013-03-17 16:08 送鲜花  3朵   附言:好文章
  • tlliqi2013-03-17 16:42 送鲜花  20朵   附言:谢谢
2013-03-17 15:35
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
程序代码:
*假设你的数据表名称为T.DBF
SELECT * FROM T WHERE .F. INTO CURSOR T2 READWRITE
SELECT BJ FROM T GROUP BY BJ INTO CURSOR T1
SELECT T1
SCAN
   INSERT INTO T2 SELECT TOP 3 BJ,XM,CJ FROM T ORDER BY BJ ,CJ DESC WHERE BJ=T1.BJ
ENDSCAN
SELECT T2 &&查询结果表
BROWSE


图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 bccn201203 于 2013-3-17 15:58 编辑 ]
收到的鲜花
  • djszyyc2013-03-17 16:08 送鲜花  3朵   附言:我很赞同
  • tlliqi2013-03-17 16:42 送鲜花  20朵   附言:谢谢
2013-03-17 15:50
djszyyc
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2013-3-17
收藏
得分:0 
这条语句为何不能执行
select 班别,姓名,成绩 from cj r1 where(select count(1) from cj r2 where r2.班别=r1.班别 and r2.成绩>= r1.成绩)<=3 order by 班别,成绩
2013-03-17 15:50
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
以下是引用djszyyc在2013-3-17 15:50:37的发言:

这条语句为何不能执行
select 班别,姓名,成绩 from cj r1 where(select count(1) from cj r2 where r2.班别=r1.班别 and r2.成绩>= r1.成绩)<=3 order by 班别,成绩
VFP SQL命令不支持这种查询方法。
收到的鲜花
  • djszyyc2013-03-17 16:07 送鲜花  3朵   附言:我很赞同
2013-03-17 15:57
快速回复:vfp用sql如何取出每个班中的前3名
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035354 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved