某业务系统用来实现资金进出的纪录,业务系统的管理数据库的部分关系模式如下所示: 
    基础信息表(KMBM,KMMC,KMSX,CLX) 
   历史资金发生余额表(KMBM,YE)
近期资金明细发生纪录表(ID,ID2,KMBM,LRLC,FSE)   
表一: 
KMBM KMMC KMSX ZCLX
101 银行存款 银行存款 资产类
10101 北京存款 银行存款 资产类
10102 上海存款 银行存款 资产类
201 预收账款 预收账款 负债类
202 其他应付款 其他应付款 负债类
表二:
KMBM YE
101 100000000
10101 66000000
10102 34000000
201 0
202 100000000
表三:
ID ID2 KMBM LRLC FSE
1 1 10101 + 50000
1 2 20101 + 50000
2 1 202 - 3200000
2 2 10101 - 3200000
表三中(LRLC字段值等于“+”标示流入,:LRLC字段值等于“-”标示流出。[1-1]: 
请根据上述三个数据表的字段和数据纪录反映出的结果,按照个人理解标示出各表的主外键信息。并说明理由.[1-2]:
请通过编写一条SQL语句查询出表一中的KMBM字段值对应的最新余额信息,以不相同的明细KMBM为单位进行统计,统计的结果中要包含表一中的所有字段信息和计算的最新余额。(最新余额=历史资金余额+近期资金流入-近期资金流出)[1-3]
根据下面的查询结果,编写一条SQL语句实现输出结果同下面的查询结果,并分析原设计着输出此结果的设计思想。
KMBM       KMMC       YE
――――――――――――――――――
101          银行存款      96850000
201          预收账款         50000
202          其他应付款    96800000

解决方案 »

  1.   

    [1-1] 表1 主键KMBM 表二 外键 KMBM  表三 主键 (ID,ID2)  外键 KMBM[1-2]
    select c.*,temp2
    from
    (
    select a.KMBM
    ,sum(temp1) temp2
    from
    (
    select KMBM, sum(YE) temp1
      from 表二
     group by KMBM
    union all
    select KMBM,
           sum(case
             when lrlc = '-' then
              to_number('-' || fse)
             else
              fse
           end) temp1 from 表三 group by KMBM
     ) a
     group by a.KMBM
    ) b, 表一 c
    where b.KMBM=c.KMBM;
    [1-3] 
    select c.KMBM,c.KMMC,temp2
    from
    (
    select a.id
    ,sum(temp1) temp2
    from
    (
    select substr(KMBM,1,3) id, sum(YE) temp1
      from 表二
     group by substr(KMBM,1,3)
    union all
    select substr(KMBM,1,3) id,
           sum(case
             when lrlc = '-' then
              to_number('-' || fse)
             else
              fse
           end) temp1 from 表三 group by substr(KMBM,1,3)
     ) a
     group by a.id
    ) b, 表一 c
    where b.id=c.KMBM;
    没测试 你自己试试