当前位置:学学看123知识中心电脑教学数据库教程group by分组的应用» 正文

group by分组的应用

[06-11 18:16:51]   来源:http://www.xxk123.com  数据库教程   阅读:8308

导读:结果就是重复的编号,对应的aa字段就是重复的次数。在第二步,好象可以不用二条命令就可以得出结果了,只是暂时还没想到,不知各位对些有什么看法。上面这种方法有个缺点:就是使用了sum()函数,而它是只能统计数值型的数据,其它字符型、日期型等是不能统计的。所以如果想把一个表中所有记录的产品名称都串起来,变成一个字符串,那是不能的。但对于日期型,变通一下,有时还是可以使用的。二、日期相减的结果是数值,从而可以使用sum()函数。例子二编号名称入库日期1网卡2000.09.021网卡2000.09.031网卡2000.09.052vfp2000.09.052vfp2000.09.06说明:把编号和名称相同,入库日期相间为1的记录合并为一条,并加入另一个表里,如结果:编号 名称 入库日期 (表2和表1结构一样)1网卡2000.09.031网卡2000.09.052vfp2000.09.06要完成上面的要求,用两个步骤:1、sele * from 表1 orde by 名称,入库日期 into curs temp12、sele 编号,名称,max(入库日

group by分组的应用,标签:sql数据库教程,access数据库教程,http://www.xxk123.com

结果就是重复的编号,对应的aa字段就是重复的次数。

在第二步,好象可以不用二条命令就可以得出结果了,只是暂时还没想到,不知各位对些有什么看法。

上面这种方法有个缺点:就是使用了sum()函数,而它是只能统计数值型的数据,其它字符型、日期型等是不能统计的。所以如果想把一个表中所有记录的产品名称都串起来,变成一个字符串,那是不能的。但对于日期型,变通一下,有时还是可以使用的。

二、日期相减的结果是数值,从而可以使用sum()函数。例子二

编号名称入库日期1网卡2000.09.021网卡2000.09.031网卡2000.09.052vfp2000.09.052vfp2000.09.06

说明:把编号和名称相同,入库日期相间为1的记录合并为一条,并加入另一个表里,如结果:

编号     名称   入库日期        (表2和表1结构一样)1网卡2000.09.031网卡2000.09.052vfp2000.09.06

要完成上面的要求,用两个步骤:

1、sele * from 表1 orde by 名称,入库日期 into curs temp12、sele 编号,名称,max(入库日期), 入库日期-recn() as dd;   from temp1 ;   grou by 名称,dd ;   into curs temp2

问题的关键是那个"入库日期-recn() as dd",因为已经按日期按好了顺序,所以9月2号减1和9月3号减2的结果都是相同的,但9月5号减3就是另外一个数了,所以这样就把这些日期分开了,就可以用分组了。假设表内容如下:(xm是字符类型,其中的1代表上午上班,2上午下班,3、4如此类推)

这个例子,到在处理第二步的时候,其实就跟第一个例子一样了,都是把一个字段减去记录号,然后根据结果进行分组。

例子三:某员工某月的打卡记录temp1如下:

打卡时间SJ项目XM状态ZT2000/09/1308:01:00AM1On time2000/09/1312:00:00AM2On time2000/09/1302:00:00PM3On time2000/09/1305:59:00PM4Early 2000/09/1208:00:00AM1On time2000/09/1212:00:00AM2On time2000/09/1202:00:00PM3On time2000/09/1206:00:00PM4On time2000/09/1408:00:00AM1On time2000/09/1412:00:00AM2On time2000/09/1402:01:00PM3Later 2000/09/1406:00:00PM4On time2000/09/1508:00:00AM1On time2000/09/1512:00:00AM2On time2000/09/1502:00:00PM3On time2000/09/1506:00:00PM4On time

xm中的1、2、3、4分别代表早上上班、早上下班、下午上班、下午下班。zt中on time表示准时,early表示早退,later表示迟到。在以上数据,把每天的上下班状态用以下的格式列出来:

日期上午上班时间上午下班时间下午上班时间下午下班时间上午上班状态下午状态

很明显,这是根据打时间进行分组。如果使用:

ele day(sj) as dd ,     iif(xm='1',sj,{}) as 上午上班时间, ;     iif(xm='2',sj,{}) as 上午下班时间 ;   from temp1 ;  grou by dd 

这个方法不行,原因我详细说一下,可能会有点罗嗦。先说说13号这天的数据。在第一个记录,在第一个iif(),xm=1,上午上班时间就是早上八点。到了第二个记录,xm=2,所以第一个iif()的就是{},即空白日期。到了第三、四个记录,上午上班时间都是空白日期,所以到最后的结果就是13号这天,上午上班时间是空白日期而不是早上八点!其他日期、除了下午下班时间之外其他时间都是如此。按前面说的分组过程,是先对每天的记录进行分组,然后按顺序一个个记录的计算iif()的结果,每计算一次iif(),都更新上午上班时间的值,这样在每天四个上下班时间中,前面三个记录都不起作用,只有第四个才起作用了。

那是不是就不能用分组了呢?那又不是,我们有sum()函数,在sum()函数里,它可以累计前面那三个记录的值,但要是数值型的字段才行。而现在却是日期型,所以我们要转换一下。命令如下:

先定义一个全程变量:initsj={^1900-01-01,00:00:00},即1900年1月1日零时,用它来做基准时间。

SELECT DAY(sj) AS dd,;  initsj+SUM(IIF(xm="1",sj-initsj,0)) AS sj1,;  initsj+SUM(IIF(xm="2",sj-initsj,0)) AS sj2,;  initsj+SUM(IIF(xm="3",sj-initsj,0)) AS sj3,;  initsj+SUM(IIF(xm="4",sj-initsj,0)) AS sj4,;  IIF(SUM(IIF(xm="1".AND.zt="on time",1,0))=1,"on time","NO time"),;  IIF(SUM(IIF(xm="3".AND.zt="on time",1,0))=1,"on time","NO time");FROM 数据1!temp5;GROUP BY 1

上一页  [1] [2] [3]  下一页


Tag:数据库教程sql数据库教程,access数据库教程电脑教学 - 数据库教程
前一篇:union的使用
《group by分组的应用》相关文章

Copyright 学学看123 All Right Reserved.

1 2 3 4 5 6 7 8 9 10