免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4381 | 回复: 10

大家帮忙思考一个SQL逻辑,连续工作日的金额汇总问题 [复制链接]

论坛徽章:
0
发表于 2006-06-06 15:24 |显示全部楼层
有一个表journal,有交易金额(amt)、交易日期(date)、客户账号(acc)三个字段,需要在2005-1-1到2006-1-1这段时间内统计出连续10个工作日内交易金额累计超过100000元的客户的账号,这个SQL如何写?我是写ec程序时用到的,我想可以使用c语言和SQL配合来做这个事情,不过个人觉得又土又麻烦,谁能想出简单些的方法?

论坛徽章:
0
发表于 2006-06-06 15:46 |显示全部楼层
用存储过程也可以实现。
foreach 日期 循环 用日期 between  rq and rq+9 按帐号分组统计,判断,返回数据。

论坛徽章:
0
发表于 2006-06-06 15:52 |显示全部楼层
有没有办法不用外部的循环来帮助实现呢?

论坛徽章:
0
发表于 2006-06-06 17:18 |显示全部楼层
一条单纯的sql语句不可能,
除非你写个存储过程再在sql里边调用,
可读性还不如ec,
效率方面不好说

论坛徽章:
0
发表于 2006-06-06 17:35 |显示全部楼层
我就是要用ec程序呀,不用存储过程,不过很麻烦。用ec的话看谁想得出简单的法子。

论坛徽章:
0
发表于 2006-06-06 20:31 |显示全部楼层
用4GL来写不是更好吗?

论坛徽章:
0
发表于 2006-06-07 09:24 |显示全部楼层
我在这里必须用ec来写

论坛徽章:
0
发表于 2006-06-07 11:27 |显示全部楼层
原帖由 forest077 于 2006-6-6 15:24 发表
有一个表journal,有交易金额(amt)、交易日期(date)、客户账号(acc)三个字段,需要在2005-1-1到2006-1-1这段时间内统计出连续10个工作日内交易金额累计超过100000元的客户的账号,这个SQL如何写?我是写ec程序时用到的,我想可以使用c语言和SQL配合来做这个事情,不过个人觉得又土又麻烦,谁能想出简单些的方法?

连续10个工作日内交易金额累计

工作日如何定义?如果和自然日不同就麻烦了

不过个人觉得又土又麻烦,谁能想出简单些的方法?

你把自己的方法列一下,别人才能比较出思路是否比你的简单些

论坛徽章:
0
发表于 2006-06-07 11:51 |显示全部楼层
也行,我把现在自己的代码贴一下,为了方便大家阅读,我尽量简化。工作日就是自然日。ec代码如下:
EXEC SQL select * from 原始表 where 1<>1 into temp 结果表;//创建结果表
for ( lDate=开始日期 ; lDate<结束日期-10 ; lDate++ )        //从开始日期到结束日期循环
{
        EXEC SQL select unique * from 原始表
                where date between :lDate and :lDate+10
                and 其他搜索条件
                into temp tmp_r;        //选取出时间区间内某10天的所有符合条件的记录
        EXEC SQL select sum(amt) as sumamt,acc
                from tmp_r
                group by acc
                into temp tmp_r1;        //把每个账号这段时间内的交易金额汇总
        EXEC SQL insert into 结果表
                select * from tmp_r
                where acc in
                        (select acc from tmp_r1
                        where sumamt>=100000);        //取出金额总数大于100000的记录放进结果表
        EXEC SQL drop table tmp_r;
        EXEC SQL drop table tmp_r1;
}
这样的缺点是,在结果表中就会存在很多重复的记录,比如有一个交易单笔金额超过100000,那么用这个方法就会在结果表中重复10次,在数据量大时这是很不划算的。
ikb有何高见?请指教,谢谢。

论坛徽章:
0
发表于 2006-06-07 12:16 |显示全部楼层
我没有高见,
只有讨论。

1.既然结果只需要帐号,为了避免重复,可以考虑先挑出唯一帐号
  declare cur cursor for select distinct acc from journal
   不知道有没有可能同一帐号同一天可能进行多笔交易,可能的话 帐号数 远小于 journal 中的记录总数,这个 distinct 应该效率不低。当然之前还可以考虑做一些预处理以加快效率,譬如某acc在journal中记录总数小于10的可以不用考虑等等

2.在 fetch cur into :acctmp 的循环中嵌套 你所列的从开始日期到结束日期的循环,对于循环来说,最重要的是添加判断条件,及早跳出循环,这样效率才高。
   for ( lDate = 开始日期 ; lDate <= 结束日期 - 9 ; lDate++  )  
   {
       select sum(amt)
       into :sumamt
       from journal
       where acc = :acctmp
       and date between :lDate and :lDate + 9

       if ( sumamt >= 100000)
          将满足条件的acc插入临时表,并跳出本层循环,继续下一个账号
   }
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会以“架构革新 高效可控”为主题,设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。
http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP