这里有三张表,三张之间以bianhao(编号)相连:table1---主表:bianhao(编号)
name(姓名)
shangqiyue(上期余额)
tingjitime(停机时间)table2---应收费用
bianhao(编号)
yuefen(月份)
feiyong1(费用1)
feiyong2(费用2)
otherfeiyong(其他费用)其中各月的:feiyong1(费用1)+feiyong2(费用2)+otherfeiyong(其他费用)=本期已收金额
table3----已收费用 (本期发生的所有的费用全部放在一个表中)bianhao(编号)
shoufeitime(收费时间)
shoufeijine(收费金额)其中:所有的收费金额之和为本期应收金额:
最后这三张表连接起来又形成了一个公式:shangqiyue(上期余额)+本期已收金额-本期应收金额=当前余额(若当前余额<0就表示欠费)
这时候,我想在一个窗口的DBgrid控件里把当前没有停机的所有的欠费的bianhao都出来。。应该怎么做?

解决方案 »

  1.   

    select distinct a.bianhao from table1 a, table2 b, table3 c where (a.tingjitime is null) and ((a.shangqiyue + b.feiyong1 +b.feiyong2 +b.otherfeiyong -c.shoufeijine) <0)
      

  2.   

    select biaohao,count(*),sum(a.shangqiyue+b.feiyong1+b.feiyong2+b.otherfeiyong-c.shoufeijine)
    from table1 a,table2 b,table3 c
    where a.bianhao=b.biaohao and
    a.bianhao=c.bianhao and
    b.bianhao=c.bianhao and
    (a.tingjitime<>"" or a.tingjitime is null)
    group by a.bianhao 
    having sum(a.shangqiyue+b.feiyong1+b.feiyong2+b.otherfeiyong-c.shoufeijine)<0 
    你试试看。
      

  3.   

    不是吧。。你们两个的SQL差别这么大?有一点要提出的是:a.tingjitime<>"" 这条语句不能判断是否停机的。。因为这条用户可以提前要求是什么时候停机的。就是说tingjitime这一条的内容也可能是未来某一天的时间,如:2004-4-23
      

  4.   

    如果变化一下:我想在一个窗口的DBgrid控件里把当前没有停机的所有的第三月份欠费的bianhao都出来。。应该怎么做?
      

  5.   

    select biaohao as 欠费编号,sum(a.shangqiyue+b.feiyong1+b.feiyong2+b.otherfeiyong-c.shoufeijine) as 欠费金额 
    from table1 a,table2 b,table3 c
    where a.bianhao=b.biaohao and
    a.bianhao=c.bianhao and
    b.bianhao=c.bianhao and
    (a.tingjitime<>"" or a.tingjitime is null)
    group by a.bianhao 
    having sum(a.shangqiyue+b.feiyong1+b.feiyong2+b.otherfeiyong-c.shoufeijine)<0
    query1-datasource1-dbgrid;
      

  6.   

    把 Wally_wu(韦利) 的改一下
    (a.tingjitime is null or a.tingjitime < '当前时间') 
    应该差不多了!
      

  7.   

    select distinct a.bianhao from table1 a, table2 b, table3 c where (a.tingjitime is null or a.tingjitime > '当前时间') and ((a.shangqiyue + b.feiyong1 +b.feiyong2 +b.otherfeiyong -c.shoufeijine) <0)
      

  8.   

    select distinct a.bianhao from table1 a, table2 b, table3 c where (a.tingjitime is null or a.tingjitime > '当前时间') and a.bianhao =b.bianhao and c.bianhao=a.bianhao and ((a.shangqiyue + b.feiyong1 +b.feiyong2 +b.otherfeiyong -c.shoufeijine) <0)
      

  9.   

    我想可能你们误解了我的意思:那么我举个实例吧:例如
    table1中有记录如下:(13611111111 上期有余额200)bianhao       name   shangqiyue     tingjitime13611111111   小娇      200
    13622222222   老王      300table2中记录如下:  (13611111111 本期各月应收费用之和为1500+1800+900=4200) bianhao        yuefen  feiyong1    feiyong2   otherfei   13611111111      1        500         500       500    (总和 ---1500)
    13611111111      2        600         600       600    (总和---1800)
    13611111111      3        300         300       300    (总和--900)
    13622222222      1        400         400       400    (总和--1200)
    table3记录如下:   (13611111111 本期的交费总和为  1500+1800+600= 3900)  bianhao            shoufeitime              shoufeijine13611111111          2003-2-15                  1500
    13611111111          2003-3-15                  1800
    13611111111          2003-4-15                  600
    13622222222          2003-4-15                  700
          这时候我需要查出有哪些人欠费:13611111111的当前余额=3900+200-4200=-100 表示这个号欠费。
    13622222222的当前余额=700+300-1200=-200  表示这个号也欠费。  这个时候我需要在DBGrid显示出来的信息应该是:bianhao         shangqiyue(上期余额)    yingshou(本期应收)   yishou(本期已收)    jiyu(当前余额)13611111111        200                     4200                  3900                -100
    13622222222        300                     1200                  700                 -200 我应该怎么做?
      

  10.   

    我想可能你们误解了我的意思:那么我举个实例吧:例如
    table1中有记录如下:(13611111111 上期有余额200)bianhao       name   shangqiyue     tingjitime13611111111   小娇      200
    13622222222   老王      300table2中记录如下:  (13611111111 本期各月应收费用之和为1500+1800+900=4200) bianhao        yuefen  feiyong1    feiyong2   otherfei   13611111111      1        500         500       500    (总和 ---1500)
    13611111111      2        600         600       600    (总和---1800)
    13611111111      3        300         300       300    (总和--900)
    13622222222      1        400         400       400    (总和--1200)
    table3记录如下:   (13611111111 本期的交费总和为  1500+1800+600= 3900)  bianhao            shoufeitime              shoufeijine13611111111          2003-2-15                  1500
    13611111111          2003-3-15                  1800
    13611111111          2003-4-15                  600
    13622222222          2003-4-15                  700
          这时候我需要查出有哪些人欠费:13611111111的当前余额=3900+200-4200=-100 表示这个号欠费。
    13622222222的当前余额=700+300-1200=-200  表示这个号也欠费。  这个时候我需要在DBGrid显示出来的信息应该是:bianhao  shangqiyue(上期余额)  yingshou(本期应收)  yishou(本期已收) jiyu(当前余额)13611111111        200          4200                  3900                -100
    13622222222        300          1200                  700                 -200 我应该怎么做?
      

  11.   

    另外100分在这里:http://expert.csdn.net/Expert/topic/1634/1634356.xml?temp=.8330957
      

  12.   

    select table1.bianhao from 
      (select bianhao,sum(feiyong1) as f1,sum(feiyong2) as f2, sum(otherfei) as f3    from table2 group by bianhao ) as a,
      (select bianhao, sum(shoufeijine) as sf from table3 group by bianhao ) as b
    where
      table1.shangqiyue+b.sf-a.f1-a.f2-a.f3<0 and
      table1.bianhao=a.bianhao and b.bianhao=a.bianhao
      

  13.   

    feiyong1(费用1)+feiyong2(费用2)+otherfeiyong(其他费用)=本期已收金额
    是不是写错了?应该是应收费用吧
      

  14.   

    select bianhao, Sum(shangqiyue) as shangqiyue ,Sum(beny) as beny ,Sum(benyj) as benyj from
    (
    select bianhao ,Sum(Convert(int,shangqiyue)) as shangqiyue , Sum(0) as beny ,Sum(0) as benyj  from tables1 group by bianhao
    union all
    select bianhao ,Sum(0) as shangqiyue , (Sum(convert(int,feiyong1)) + Sum(convert(int,feiyong2)) + Sum(convert(int,otherfeiyong ))) as beny ,Sum(0) as benyj from tables2 group by bianhao
    union all
    select bianhao ,Sum(0) as shangqiyue , Sum(0) as beny ,Sum(convert(int,shoufeijine)) as benyj  from tables3 group by bianhao
    ) t group by bianhao第5个字段作一个计算字段
      

  15.   

    to  Taken(铁拳) 是的。。是已收费用。 Taken(铁拳) 和wjlsmail(计算机质子) 两人写的sql语句怎么相关这么大?我仔细看看再定夺!!!!!
      

  16.   

    select a.bianhao, shangqiyue,sum(feiyong1+feiyong2+otherfei) yingshou,
    sum(shoufeijine) yishou ,(yishou-yingshou) jiyu  
    from table1 a,table2 b,table3 c 
    group by a.bianhao,shangqiyue
      

  17.   

    漏了一句
    select a.bianhao, shangqiyue,sum(feiyong1+feiyong2+otherfei) yingshou,
    sum(shoufeijine) yishou ,(yishou-yingshou) jiyu  
    from table1 a,table2 b,table3 c 
    where jiyu<0
    group by a.bianhao,shangqiyue
      

  18.   

    select distinct bianhao,a.fee 上期余额,b.fee 本期应收
     ,c.fee 本期已收,A.FEE+c.fee-b.fee 当前余额
    from 
    (select bianhao,shangqiyue as fee from table1) a,
    (select bianhao,sum(feiyong1+feiyong2+ortherfei) as fee from table2
    group by bianhao) b,  --4200
    (select bianhao,sum(shoufeijine) as fee from table3
    group by bianhao) c  --3900 
    where a.bianhao=b.bianhao and b.bianhao=c.bianhao
      

  19.   

    这样写:
    select a. bianhao, a.shangqiyue, (select sum(b.feiyong1+b.feiyong2+b.otherfei) from b where b.bianhao=a.bianhao) as yingshou, (select sum(c.shoufeijine) from c where b.bianhao=a.bianhao) as yishou, (yishou-yingshou) as jiyu from table1 a, table2 b, table3 c where a.bianhao=b.bianhao and a.bianhao=c.bianhao order by a.bianhao
      

  20.   

    这样写:
    select a. bianhao, 
    a.shangqiyue, 
    (select sum(b.feiyong1+b.feiyong2+b.otherfei) from b where b.bianhao=a.bianhao) as yingshou, 
    (select sum(c.shoufeijine) from c where b.bianhao=a.bianhao) as yishou, (yishou-yingshou) as jiyu 
    from table1 a, table2 b, table3 c where a.bianhao=b.bianhao and a.bianhao=c.bianhao order by a.bianhao
      

  21.   

    TO Wally_wu(韦利) ,按你的方法,,大概意思是数据库引擎找不到表b'..不知道怎么回事。
      

  22.   

    这样写:
    select a. bianhao, 
    a.shangqiyue, 
    (select sum(b.feiyong1+b.feiyong2+b.otherfei) from table2 where b.bianhao=a.bianhao) as yingshou, 
    (select sum(c.shoufeijine) from table3 where b.bianhao=a.bianhao) as yishou, (yishou-yingshou) as jiyu 
    from table1 a, table2 b, table3 c where a.bianhao=b.bianhao and a.bianhao=c.bianhao order by a.bianhao
      

  23.   

    Wally_wu(韦利) 我是按你的方法来写的。不过发生了一件事令我百思不得其解。就是假如13611111111在table2中的记录中有4条,在table3的记录中有 3条。。那么按你的sql查询出来的13611111111的记录就是4*3=12条。。其中的数据也各不相同。。形成了排列组合的形式。。我实在搞不清为什么了:(
      

  24.   

    chenquan(嘉威王子),你的方法对了。。可以统计出来。。但有一个问题,就是像 weitao999(涛涛) 提醒的那样。假如table1中有13611111111的记录,而table2或者table3表中没有关于13611111111的话,那么关于13611111111的记录就没显示出来。。应该怎么办呢?后悔没学好数据库。。来不及看书了。:(。。
      

  25.   

    例如在table1中有13611111111的记录如下:bianhao       name   shangqiyue     tingjitime13611111111   小娇      -200但在table2和table3中都不存在13611111111的记录。。或者其中一个表中不存在。那么这条记录就没有显示出来。。
      

  26.   

    UP 用 外连接 试试!!~~~
         ......
         where a.bianhao *= b.bianhao and b.bianhao *= c.bianhao
    或   where a.bianhao left outs join b.bianhao and b.bianhao left outs join c.bianhao
      

  27.   

    错应该是 where a.bianhao left outer join b.bianhao and b.bianhao left outer join c.bianhao
      

  28.   

    Blackride(黑骑士) ,不行的。。说是语法错误(操作符丢失):(
      

  29.   

    再使用distinct吧
    这样写:
    select distinct a. bianhao, 
    a.shangqiyue, 
    (select sum(b.feiyong1+b.feiyong2+b.otherfei) from table2 where b.bianhao=a.bianhao) as yingshou, 
    (select sum(c.shoufeijine) from table3 where b.bianhao=a.bianhao) as yishou, (yishou-yingshou) as jiyu 
    from table1 a, table2 b, table3 c where a.bianhao=b.bianhao and a.bianhao=c.bianhao order by a.bianhao
      

  30.   

    TO  Wally_wu(韦利) 。不行。。按你的方法也出现了我刚刚发现的情况,就是:例如在table1中有13611111111的记录如下:bianhao       name   shangqiyue     tingjitime13611111111   小娇      -200但在table2和table3中都不存在13611111111的记录。。或者其中一个表中不存在。那么这条记录就没有显示出来。。
      

  31.   

    并且我刚刚试了一下:要按你的方法。上面我说的那个3*4的问题还是没解决。。我想是这样。。就按 chenquan(嘉威王子)的方法来写。目前需要解决的问题是:要让所有记录都统计一下。。不要出现漏网之鱼。。table2,或者table3中有无某个卡号的记录都不要影响统计意思是只要主表table1中有的卡号。不管在table2和table3中有无记录,都要统计出来。:select distinct bianhao,a.fee 上期余额,b.fee 本期应收
     ,c.fee 本期已收,A.FEE+c.fee-b.fee 当前余额
    from 
    (select bianhao,shangqiyue as fee from table1) a,
    (select bianhao,sum(feiyong1+feiyong2+ortherfei) as fee from table2
    group by bianhao) b,  --4200
    (select bianhao,sum(shoufeijine) as fee from table3
    group by bianhao) c  --3900 
    where a.bianhao=b.bianhao and b.bianhao=c.bianhao
      

  32.   

    你是不是想table2和table3中都不存在13611111111的记录也显示出来:可以这样
    select distinct a. bianhao, 
    a.shangqiyue, 
    (select sum(b.feiyong1+b.feiyong2+b.otherfei) from table2 where b.bianhao=a.bianhao) as yingshou, 
    (select sum(c.shoufeijine) from table3 where b.bianhao=a.bianhao) as yishou, (yishou-yingshou) as jiyu 
    from table1 a, table2 b, table3 c order by a.bianhao
      

  33.   

    对啊。。但我已经说过了。你这样写很奇怪就是不行(光是关于13611111111的记录要出现好多条):要这样写才行。。怎么修改如下的代码才行呢?select distinct bianhao,a.fee 上期余额,b.fee 本期应收
     ,c.fee 本期已收,A.FEE+c.fee-b.fee 当前余额
    from 
    (select bianhao,shangqiyue as fee from table1) a,
    (select bianhao,sum(feiyong1+feiyong2+ortherfei) as fee from table2
    group by bianhao) b,  --4200
    (select bianhao,sum(shoufeijine) as fee from table3
    group by bianhao) c  --3900 
    where a.bianhao=b.bianhao and b.bianhao=c.bianhao
      

  34.   

    实际我写的代码如下:str1:='select distinct a.kahao as 卡号,a.fee as 上期余额,b.fee as 本期应收,c.fee as 本期已收,a.fee+c.fee-b.fee as 当前余额 from (select kahao,shangqiyue as fee from saleka) a,'; str2:='(select kahao,sum(val(shijishihuafei)+val(iphuafei)+val(changhuafei)+val(manyoufei)+val(xinxifei)+val(otherfei)) as fee from salekafei group by kahao) b,'   ; str3:='(select kahao,sum(shoufeijine) as fee from salekashoufei group by kahao) c  where a.kahao= b.kahao and b.kahao=c.kahao ';  ADOQuery_SaleKaSum.SQL.Clear ;
       ADOQuery_SaleKaSum.SQL.Add(str1+str2+str3);
       ADOQuery_SaleKaSum.ExecSQL;
      

  35.   

    用存储过程吧,多方便CREATE        PROCEDURE GetQianFee
      @Rkdh varchar(50),@Dwbm char(20),@Czy int
    AS
      Create Table #Temp1 (bianhao int,shangqiyue decimal(19,2),feiyong decimal(19,2),
        shoufeijine decimal(19.2),Yue decimal(19,2) )
    insert into #Temp1 select bianhao,shangqiyue,0,0,0 from table1
    update #Temp1 set feiyong=sum(feiyong1+feiyong2+otherfeiyong) from #Temp1 a where #Temp1.bianhao=a.bianhao
           group by a.bianhao
    update #Temp1 set shoufeijine=sum(shoufeijine) from #Temp1 a where #Temp1.bianhao=a.bianhao
           group by a.bianhao
    update #Temp1 set yue=shangqiyue+shoufeijine-feiyong 
    select * from #Temp1 a,table b where a.bianhao=b.bianhao and a.yue<0 and b.tingtime<>'' and b.tingtime>getdate()
      

  36.   

    不能用存储。。我用的是delphi+access!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!呵呵。。怪不得我见前面有个朋友写#,,当时我看不懂是什么意思。。
      

  37.   

    select distinct a. bianhao, 
    a.shangqiyue, 
    (select sum(b.feiyong1+b.feiyong2+b.otherfei) from table2 where b.bianhao=a.bianhao) as yingshou, 
    (select sum(c.shoufeijine) from table3 where b.bianhao=a.bianhao) as yishou, (yishou-yingshou) as jiyu 
    from table1 a, table2 b, table3 c where a.bianhao=b.bianhao and a.bianhao=c.bianhao order by a.bianhao取得的结果集等同于:select distinct bianhao,a.fee 上期余额,b.fee 本期应收
     ,c.fee 本期已收,A.FEE+c.fee-b.fee 当前余额
    from 
    (select bianhao,shangqiyue as fee from table1) a,
    (select bianhao,sum(feiyong1+feiyong2+ortherfei) as fee from table2
    group by bianhao) b,  --4200
    (select bianhao,sum(shoufeijine) as fee from table3
    group by bianhao) c  --3900 
    where a.bianhao=b.bianhao and b.bianhao=c.bianhao
      

  38.   

    谢谢 Wally_wu(韦利) 。我再试。
      

  39.   

    不行按如下代码写还是会出现一个卡号对应X*Y 行(X表示13611111111在table2中的记录数,Y表示其在table3中的记录数)记录的情况。select distinct a. bianhao, 
    a.shangqiyue, 
    (select sum(b.feiyong1+b.feiyong2+b.otherfei) from table2 where b.bianhao=a.bianhao) as yingshou, 
    (select sum(c.shoufeijine) from table3 where b.bianhao=a.bianhao) as yishou, (yishou-yingshou) as jiyu 
    from table1 a, table2 b, table3 c where a.bianhao=b.bianhao and a.bianhao=c.bianhao order by a.bianhao
      

  40.   

    为了感谢各位朋友的帮忙:我又加了100分。。请去:http://expert.csdn.net/Expert/topic/1643/1643422.xml?temp=.9598963