| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2169 人关注过本帖, 1 人收藏
标题:求教:关于SELECT查询结果运算和合并的问题
只看楼主 加入收藏
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
我认为楼主至目前为止是国内顶尖的 SQL 语言大师,如果再提高一步玩花哨,你只用一条 Select SQL 语句,把汇总和排名写出来,教教我们,可以吗?
你行的,你最棒。

[ 本帖最后由 aaaaaa 于 2015-9-10 11:32 编辑 ]

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2015-09-10 11:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用aaaaaa在2015-9-10 11:30:13的发言:

我认为楼主至目前为止是国内顶尖的 SQL 语言大师,如果再提高一步玩花哨,你只用一条 Select SQL 语句,把汇总和排名写出来,教教我们,可以吗?
你行的,你最棒。


授人以渔,不授人以鱼。
2015-09-10 15:52
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
楼主,可以了吗?我知道你行的。你是最棒的!点赞。

这样吧,我先做一些基础工作,构造样本数据,假设有20个学校,每校500人,只统计语文成绩。
汇总出:代码, 学校, 人数, 语文平均分, 语文优秀数, 语文及格数, 语文优秀率, 语文及格率, 最高分, 最低分 和 排名。
排名是可选的:
按学校代码从高到低排列
按学校代码从低到高排列
按语文平均分名次从高到低排列
按语文平均分名次从低到高排列
按语文优秀分名次从高到低排列
按语文优秀分名次从低到高排列

要求只容许一句 Selece SQL 语句
据说此类题至少可以有三种做法:
Select Sum()...... From ......
Select ...... From (Select......)......
Select ...... Join Select ...... From ......
应该不止这些,楼主老师,我说的对吗?

构造样本数据的代码如下:

程序代码:
Clear
Close Databases
Create Cursor 成绩汇总表 ( 学校 C (10), 代码 C (6), 考生 C(6), 语文 I )

*!*    构造样本数据,假设有20个学校,每校500人,只统计语文成绩
gnPassMark =  72  && 语文及格分数
gnFineMark = 102  && 语文优秀分数
*
gnLower    =  50  && 语文最低分
gnUpper    = 120  && 语文满分分数

=Rand(-1)
For I = 1 To 20  && 有20个学校
    For J = 101 To 600  && 每校500人
        Insert Into 成绩汇总表 Values( ;
        "第" + Transform(I, "@LR 99") + "中学", ;           && 学校
        Transform(I, "@LR 999999"), ;                       && 学校代码
        Transform(Int(Rand( )* 100000), "@LR 999999"), ;    && 考生编号
        Int((gnUpper - gnLower + 1) * Rand( ) + gnLower) )  && 语文分数
    Endfor
Endfor

最后的结果是:

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


谢谢您,楼主,谢谢大家老师。

[ 本帖最后由 aaaaaa 于 2015-9-11 19:32 编辑 ]

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2015-09-11 19:29
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
特别强调:20个学校 x 每校500人 = 10,000条记录
汇总必须秒杀。
如果 10W 条记录的汇总不秒杀,那是糟蹋了 VFP。

我是学生,不会做这样的高难度题目,请楼主老师一定帮我。

谢谢您!

[ 本帖最后由 aaaaaa 于 2015-9-11 19:49 编辑 ]

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2015-09-11 19:39
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用aaaaaa在2015-9-11 19:39:18的发言:

特别强调:20个学校 x 每校500人 = 10,000条记录
汇总必须秒杀。
如果 10W 条记录的汇总不秒杀,那是糟蹋了 VFP。

我是学生,不会做这样的高难度题目,请楼主老师一定帮我。

谢谢您!

“秒杀”和“分杀”的区别就真的很大吗?

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-09-11 20:48
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
这是看对象的:
像我这样的菜鸟,时杀、日杀都难办到;
像楼主这样的大牛,秒杀不在话下。

这就是区别。

我最最崇拜楼主

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2015-09-11 21:17
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
我先来吧。明天再来下一个。
统计出 : 代码, 学校, 人数, 语文平均分, 语文优秀数, 语文及格数, 语文不及格数, 语文优秀率, 语文及格率, 最高分, 最低分, 平均分名次
选择 : 按语文平均分名次从高到低排列,其他的排列次序看注释。
请楼主老师斧正!谢谢您。

1. 构造样本数据,如果已经有了相对应的 DBF 文件,这一步可以省略 :
Create Cursor 成绩汇总表 ( 学校 C (10), 代码 C (6), 考生 C(6), 语文 I )

*!*    构造样本数据,假设有20个学校,每校500人,只统计语文成绩
gnPassMark =  72  && 语文及格分数
gnFineMark = 102  && 语文优秀分数
*
gnLower    =  50  && 语文最低分
gnUpper    = 120  && 语文满分分数
*
=Rand(-1)
For I = 1 To 20  && 有20个学校
    For J = 101 To 600  && 每校500人
        Insert Into 成绩汇总表 Values( ;
        "第" + Transform(I, "@LR 99") + "中学", ;           && 学校
        Transform(I, "@LR 999999"), ;                       && 学校代码
        Transform(Int(Rand( )* 100000), "@LR 999999"), ;    && 考生编号
        Int((gnUpper - gnLower + 1) * Rand( ) + gnLower) )  && 语文分数
    Endfor
Endfor


2. 用一条 Select - SQL 语句 :
Select 代码, 学校, 人数, 语文 As 语文平均分, 语文优秀数, 语文及格数, ;
    语文不及格数, 语文优秀率, 语文及格率, 最高分, 最低分, ;
    ( Select 1 + Count(语文) From (Select 代码, 学校, Count (*) As 人数, ;
    Round(Avg(语文) + 0.00, 2) As 语文, ;
    Sum(Iif(语文>=102,1,0)) As 语文优秀数, ;
    Sum(Iif(语文>= 72,1,0)) As 语文及格数, ;
    Sum(Iif(语文 < 72,1,0)) As 语文不及格数, ;
    Round(Sum(Iif(语文>=102,1,0))/Count (*)*100, 2) As 语文优秀率, ;
    Round(Sum(Iif(语文>= 72,1,0))/Count (*)*100, 2) As 语文及格率, ;
    Max(语文) As 最高分, Min(语文) As 最低分 ;
    From 成绩汇总表 Group By 代码, 学校) As t1 Where 语文 > T2.语文) As 平均分名次 ;
    From (Select 代码, 学校, Count (*) As 人数, Round(Avg(语文) + 0.00, 2) As 语文, ;
    Sum(Iif(语文>=102,1,0)) As 语文优秀数, Sum(Iif(语文>=72,1,0)) As 语文及格数, ;
    Sum(Iif(语文 < 72,1,0)) As 语文不及格数, ;
    Round(Sum(Iif(语文>=102,1,0))/Count (*)*100, 2) As 语文优秀率, ;
    Round(Sum(Iif(语文>= 72,1,0))/Count (*)*100, 2) As 语文及格率, ;
    Max(语文) As 最高分, Min(语文) As 最低分 ;
    From 成绩汇总表 Group By 代码, 学校) As t2 ;
    Order By 语文平均分 Desc  && 按语文平均分名次从高到低排列
*!*    排列次序 :
*!*        Order By 代码 Desc        && 按学校代码从高到低排列
*!*        Order By 代码             && 按学校代码从低到高排列
*!*        Order By 语文平均分 Desc  && 按语文平均分名次从高到低排列
*!*        Order By 语文平均分       && 按语文平均分名次从高到低排列
*!*        Order By 语文优秀分 Desc  && 按语文优秀分名次从高到低排列
*!*        Order By 语文优秀分       && 按语文优秀分名次从高到低排列

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2015-09-13 19:34
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
用 Select Sum()......From Table......Group By ...... 单联的算法应该比上面的较简洁,长度只有第一种算法长度的一半。
用 Join 的算法比较麻烦,还在构思当中。

[ 本帖最后由 aaaaaa 于 2015-9-13 19:43 编辑 ]

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2015-09-13 19:40
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用星辰大海在2015-9-9 22:03:11的发言:

把最终的结果贴上来,方便有同样问题的老师。
SELECT byxx,人数,语文平均分,语文优秀数,语文及格数,100*语文优秀数/人数 语文优秀率,100*语文及格数/人数 语文及格率 ;
FROM (SELECT BYXX,COUNT (*) as 人数,AVG(语文) AS 语文平均分,SUM(IIF(语文>=102,1,0)) AS 语文优秀数,SUM(IIF(语文>=72,1,0)) AS 语文及格数 ;
FROM ZZ15 GROUP BY BYXX ORDER BY BYXX)  A INTO CURSOR 语文
SELECT *,RECNO() AS 优秀率名次 FROM (SELECT * FROM 语文 ORDER BY 语文优秀率 DESC) A INTO CURSOR 语文
SELECT *,RECNO() AS 及格率名次 FROM (SELECT * FROM 语文 ORDER BY 语文及格率 DESC) A INTO CURSOR 语文
SELECT *,RECNO() AS 平均分名次 FROM (SELECT * FROM 语文 ORDER BY 语文平均分 DESC) A INTO CURSOR 语文
SELECT * FROM 语文 ORDER BY BYXX  INTO CURSOR 语文
COPY TO 1语文.XLS XL5
其他科目只需要CTRL+F替换名称和分值即可。最后全部的表用EXCEL高级工具箱合并到一个工作簿内,所有考试成绩需要分析的项目都全了。
我开个玩笑,你表介意。
2015-09-15 14:56
星辰大海
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2015-9-4
收藏
得分:0 
以下是引用taifu945在2015-9-15 14:56:14的发言:

我开个玩笑,你表介意。

您说的本来就没什么问题,我经常看到你给别人解答问题。。
2015-10-04 12:37
快速回复:求教:关于SELECT查询结果运算和合并的问题
数据加载中...
 
   



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

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