免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2618 | 回复: 4
打印 上一主题 下一主题

查询子表各记录某属性和,如何写?挺麻烦的,困扰了一周。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-21 22:09 |只看该作者 |倒序浏览
20可用积分
需求是这样,需要得出特定某天,所有状态不为1的所有帐户的总余额。
帐户表的数据量是20000条,交易记录表的数据是30-50万条之间。

两个表的主键都是自定义序列自动增长。  表结构不能改了。因为有原始数据。   谢谢各位帮忙给我看看。我写了一条很麻烦的,可是结果不正确。
我的思路是:查询交易记录表,根据帐户外键分组条件内加上状态不为1,取得小于特定日期各个帐户的最大交易日期,取得这条数据的余额,然后进行累加。

我写的语句是:
  1. select sum(jyjl1.ye) from jyjl jyjl1 join left (
  2.                         select max(jyrq) rq1, z1.id zid from jyjl jl1 join left zhb z1 on jl1.zhid=z1.id  
  3.                              where z1.zt !=1 and jl1.jyrq < to_date('2008-01-20 20:20:20', 'yyyy-MM-dd hh24:mi:ss')
  4.                              group by zhid
  5.           ) rs1 on jyjl1.jyrq=rs1.rq1
  6.           where jyjl1.zhid=rs1.zid
复制代码


有两个表,一个主表(帐户表),一个子表(帐户操作记录表),结构大概是这样:

jyjl(交易记录表):

id(主键)                      jyrq(交易日期)                       zcje(支出金额)                        ye(余额)                 zhid(帐户id外键)

2                                 2008-01-30 19:30:34               50                                        950                              3
1                                 2008-01-20 20:20:20               5000                                   1000                             3
5                                 2008-01-20 10:28:23               500                                      6000                            3
3                                 2009-12-31 05:30:20               2000                                    100                              4
4                                 2008-03-30 10:28:23               500                                      2100                            4
6                                 2008-03-28 10:28:23               500                                      2600                            4
7                                 2008-02-28 10:28:23               500                                      3100                            4
7                                 2009-02-28 10:28:23               500                                      10000                          5



zhb(帐户表)
id(主键)                    xm(姓名)                                xb(性别)                              xzye(现在余额)                zt状态
3                                 张二                                          男                                           950                                     0
4                                 张三                                          男                                           100                                     0
5                                 李四                                          男                                           10000                                 1




谢谢!!谢谢!

[ 本帖最后由 leweslove 于 2010-1-21 22:23 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2010-01-22 09:09 |只看该作者
原帖由 leweslove 于 2010-1-21 22:09 发表
查询交易记录表,根据帐户外键分组条件内加上状态不为1,取得小于特定日期各个帐户的最大交易日期,取得这条数据的余额,然后进行累加。


查询交易记录表,根据帐户外键分组条件内加上状态不为1,取得大于特定日期各个帐户的最交易日期,取得这条数据的(余额+支出),然后进行累加。
如果没有符合的记录,就有当前余额

论坛徽章:
0
3 [报告]
发表于 2010-01-22 09:55 |只看该作者
没看明白,呵呵。

论坛徽章:
0
4 [报告]
发表于 2010-01-22 10:41 |只看该作者
select zhid,sum(ye) from jyjl where zhid in (select id from zhb where zt <> 1) and jyrq = .... group by zhid;





个人觉得,余额是一个状态,是不能用来累加的。

没有说,从去年到今年,我的余额是多少,只能说:到某一个时间点,我的余额是多少。所以我觉得你该好好去思考下整个系统的设计了,是不是这个余额应该自动更新呢?

所以我用了jyrq 等于某个日期,而不是一个范围。


ps: 用拼音真的很别扭
      left join我怎么从没用过,只是听说过 。。。

[ 本帖最后由 bigapple2008 于 2010-1-22 10:46 编辑 ]

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
5 [报告]
发表于 2010-01-22 17:58 |只看该作者
没太明白。两个表之间怎么关连的。

论坛徽章:
0
6 [报告]
发表于 2010-01-22 18:05 |只看该作者
原帖由 bigapple2008 于 2010-1-22 10:41 发表
select zhid,sum(ye) from jyjl where zhid in (select id from zhb where zt  1) and jyrq = .... group by zhid;





个人觉得,余额是一个状态,是不能用来累加的。

没有说,从去年到今年,我的余 ...



LZ讲的累加,不是一个帐户不同日期余额的累加,而是某一时间点,所有符合条件的帐户余额的累加
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP