select a.姓名,sum(b.数值) 充值和 ,sum(c.数值) 扣费和 ,
sum(isnull(b.数值,0))-sum(isnull(c.数值,0)) [差额(充值和-扣费和)]
from 用户表 a 
join 扣费表 b on a.姓名=b.姓名
join 充值表 c on a.姓名=c.姓名
group by a.姓名

解决方案 »

  1.   

    刚才 扣费和 和 充值和 弄反了
    select a.姓名,sum(b.数值) 扣费和 ,sum(c.数值) 充值和 ,
    sum(isnull(c.数值,0))-sum(isnull(b.数值,0)) [差额(充值和-扣费和)]   
    from 用户表 a 
    join 扣费表 b on a.姓名=b.姓名
    join 充值表 c on a.姓名=c.姓名
    group by a.姓名
      

  2.   

    to:lishengyu(玉),谢谢,呵呵,这样连接过去,"sum(b.数值) 扣费和 ,sum(c.数值) 充值和"  扣费和与充值和肯定是有大量重复的了.因为它是a与b连接之后,再与c连接,导致了有重复的数据.并且这样连接之后,没有null值的,这个办法不妥
      

  3.   

    谢谢alexzhang00() 友情UP,自己再UP
      

  4.   

    select a.姓名,sum(a.充值),sum(a.扣费),sum(a.充值)-sum(a.扣费)
    from (
      select 姓名,数值 as 充值,0 as 扣费 from 充值表
      union all
      select 姓名,0 as 充值,数值 as  扣费  from 扣费表
    )a  group by a.姓名
      

  5.   

    谢谢 uuxiaoli(SQL你在何方),你这个SQL肯定是对的,但是我要是通过程序自动分析写出来这样的SQL,还是有难度的.
    比如用户自己定义了 取如下的列:用户表.姓名,sum(充值表.数值) as 充值和,sum(扣费表.数值) as 扣费和,sum(充值表.数值)- sum(扣费表.数值) as 余额
    我根据:扣费用/充值表/用户表的定义信息,可以找到连接字段,进而要自动生成一个SQL语句,因为用户定义了什么列我事先不知道.我可以动态生成的是这个SQL.
    select a.姓名,sum(充值表.数值) as 充值和,sum(扣费表.数值) as 扣费和,sum(充值表.数值)- sum(扣费表.数值) as 余额
    from 用户表 a left join 充值表 on a.姓名=充值表.姓名 left join 扣费表 on a.姓名=扣费表.姓名
    可惜这条SQL会出来大量重复的数据.是错的,要是能把这个SQL改成正确的就好了.
      

  6.   

    red9152(red) 说得是怎么我一时那么糊涂了
      

  7.   

    这其实就是典型的进销存中常用的三个表:一个产品表,一个入库表,一个出库表,产品表与入库表一对多,产品表与出库表一对多,用一条SQL查出来:产品,入库数,出库数,库存数. 我是想用一个简洁的SQL实现它.