转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 常用软件 >> 正文
select命令使用经验(3)         

select命令使用经验(3)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:753 更新时间:2009/4/24 21:43:57
緐nion的使用技巧】
  这个字句没什么,只是将几个select后产生的在结构完全一样的表加在地块,变成一个表。具体的例子如下(以下例子不计较这种设计方法的好坏,只是说明命令的使用):

  在做生产管理时,原材料的每笔进货、领用、报废、退货情况都要详细记录,老板随时都可能了解一个月内每种原材料的各种情况。而编程时对数据的规范化后,必然要用好几个表来记录这四种操作。现在为了更快的求出结果,命令当然是越少越好。各个表的结构如下:
进货单jhd:jhdbh,jhrq
进货单明细jhdmx:jhdbh,yclbh,jhsl
领货单lhd:lhdbh,lhrq
领货单明细lhdmx:lhdbh,yclbh,lhsl
报废单bfd:bfdbh,bfrq
报废单明细bfdmx:bfdbh,yclbh,bfsl
退货单thd:thdbh,thrq
退货单明细thdmx:thdbh,yclbh,thsl
原材料表yclb:yclbh,yclmc,yclgg
查询日期范围放在begindata,enddata里
为简便起见,只计算进货和退货,其它的照样做就行了。
Sele yclbh,sum(jhsl) as jhsl,100000.00-100000.00 as thsl ;
From jhd join jhdmx ;
On jhd.jhdbh=jhdmx.jhdbh ;
Where betw(jhd.jhrq,begindata,enddata) ;
Grou by yclbh ;
Union ;
Sele yclbh,100000.00-100000.00 ,sum(thsl) ;
From thd join thdmx ;
On thd.thdbh=thdmx.thdbh ;
Where betw(thd.thrq,begindata,enddata) ;
Grou by yclbh ;
Into curs temp1
这样就会产生这样的结果
yclbh jhsl thsl
00001 3432 0 ┐
00002 4234 0 │这些是第一节select产生的
    …… ┘
00002 0 3423 ┐
00003 0 4234 │这些是第二节select产生的
    …… ┘
现在再对临时表temp1进行一次合计
sele yclbh,sum(jhsl) as jhsl,sum(thsl) as thsl ;
from temp1 ;
grou by yclbh ;
into curs temp2
这个temp2就是结果了。

  注1:如果要计算四种操作的话,就再加多两节select就行了。
  注2:在命令里使用100000.00-100000.00这样奇怪的表达式是因为select对那些要计算的、事先不能确定长度和类型的字段,它是根据运算过程中产生的第一条记录中,该字段的值来确定这个字段的类型和长度。所以以上那条命令,第一个记录中thsl它是不知道长度是多少的,如果直接用0的话,那它就以为这个字段是数值型,长 ?1,没有小数位。这当然不行,所以就要用这样一个表达式,来使它知道这个字段有9位长,小数位是2。

【group by与distinct的区别】
  如果在字段串列中没使用字段函数,则group by参数与关键字distinct的效果相同。不过使用group by参数的效果显然要比使用关键字distinct来得快,而且在字段串列中的字段数越多,速度的差距会越大。
  如果在字段串列中使用字段函数且使用group by 参数,则仍会显示出多个数据记录。但是如果于字段串列中使用字段且使用关键字distinct,则只有一个数据记录会显示出来。显然有字段时应使用group by 参数。
例子:
1、select name,max(salary) from test grou by name
2、select dist name,max(salary) from test
结果:
              grouy by distinct
name salary name salary name salary
alex 20 alex 90 mary 95
alex 10 mary 44
alex 50 tom 95
alex 90
alex 30
tom 45
tom 55
tom 15
tom 95
mary 33
mary 44
【快速排名次】
  考试排名次,一般有个要求,就是如果有两个人并列第一,那跟着的就不是第二名,而是第三名,即第二名跳空了。所以我想出以下这个方法。
  面对大数据量的排名次,若用scan...endscan或do while这种方法,时间会非常长。1048576个记录中花了十多分钟才排了四十多万条记录。而我这种方法只需九十多秒(硬件:PII300(100*3),128M PC100,5.1G,VFP5.0),方法如下:
  1。数据库dele:rec_id c(7) 升序;name c(10);fs n(4,1) 降序;rec_orde n(7),文件大小为29M,索引文件16M
  2。建一个视图dele1
SELECT Dele.fs, Dele.rec_orde;
FROM dele;
ORDER BY Dele.fs DESC
  3。根据视图dele1建立视图dele2
SELECT DISTINCT Dele1.fs, MIN(Dele1.rec_orde) AS rec_orde;
FROM dele1;
GROUP BY Dele1.fs
  4。根据视图dele2和数据库dele建立视图dele3
SELECT Dele.rec_id, Dele.rec_orde, Dele2.rec_orde, Dele.fs;
FROM dele INNER JOIN dele2 Dele2 ;
ON Dele.fs = Dele2.fs;
ORDER BY Dele2.rec_orde
准备工作做好,现在可以排序了:
以上视图是事先做好的,不算入运行时间。
 use dele1
 repl rec_orde with recn() all
 sele 0
 use dele3
 repl rec_orde_a with rec_orde_b all
 brow
这就是你想要的!
以上是本人的一些心得体会,欢迎大家来信切磋。
hzzck@21cn.com
OICQ;2421316


[办公软件]在sybase中插入图片、PDF、文本文件  [办公软件]安装Sybase ASE
[办公软件]linux指令大全(完整篇)  [办公软件]Linux新手入门常用命令大全
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[办公软件]Linux程序员必读:中文化与GB18030标准  [办公软件]linux指令大全
[办公软件]制作Linux启动盘的四种方法  [办公软件]Linux文件系统的反删除方法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台