表1  期初表  字段: 业务员, 客户,所属月份,期初余额,期初未开票余额
表2 销售表 字段:业务员,客户,所属月份,销售额
表3 开票表 字段:业务员,客户,所属月份,开票金额
表4  收款表 字段:业务员,客户,所属月份,收款金额
要求查询按特定的所属月份来查,结果如下
业务员  sum(期初余额)  sum(销售额) sum(收款金额) 期末余额  sum(期初未开票余额)  sum(开票金额) 期末未开票余额
其中 期末余额和期末未开票余额是计算字段  期末余额=期初余额+销售额-收款金额
期末未开票余额=期初未开票余额+销售额-开票金额4张表每一条记录均不能少SQL语句怎么写,谢谢!
深夜求助!
      

解决方案 »

  1.   


    select 业务员, 所属月份, sum(期初余额) as 期初余额,  sum(销售额) as 销售额, sum(收款金额) as 收款金额, 
                sum(期初余额) + sum(销售额) + sum(收款金额) as 期末余额,
               sum(期初未开票余额) as 期初未开票余额,  sum(开票金额) as 开票金额,
               sum(期初未开票余额) + sum(销售额) - sum(开票金额) as 期末未开票余额
    from 
    (
    select 业务员, 所属月份,  期初余额, 0 as 销售额, 0 as 收款金额, 期初未开票余额, 0 as 开票金额,  0 as 期末未开票余额
    from 期初表
    union all
    select 业务员, 所属月份,  0 as 期初余额, 销售额, 0 as 收款金额, 0 as 期初未开票余额, 0 as 开票金额,  0 as 期末未开票余额
    from 销售表
    union all
    select 业务员, 所属月份,  0 as 期初余额, 0 as 销售额, 0 as 收款金额, 0 as 期初未开票余额, 开票金额,  0 as 期末未开票余额
    from 开票表
    union all
    select 业务员, 所属月份,  0 as 期初余额, 0 as 销售额, 收款金额, 0 as 期初未开票余额, 0 as 开票金额,  0 as 期末未开票余额
    from 收款表
    ) Org
    group by 业务员, 所属月份
      

  2.   

    sum(期初余额) + sum(销售额) + sum(收款金额) as 期末余额,应是sum(期初余额) + sum(销售额) - sum(收款金额) as 期末余额,我写错了
      

  3.   

          SQL.Add('select ywy,sum(qcye) as qc ,sum(ysje) as xsje,sum(je) as skje, '+
                  ' sum(qcye)+sum(ysje)-sum(je) as qmye, '+
                  ' sum(qcfpje) as qcfp, sum(jshj) as fpje,'+
                  ' sum(qcfpje)+sum(ysje)-sum(jshj) as qmfpye '+
          ' from  '+
          '(      '+
               ' select ywy,qc,0 as xsje,0 as skje,0 as qmye,qcfp,0 as fpje,0 as qmfpye '+
               ' from yskqcye '+
               ' union all  '+
               ' select ywy,0 as qc,xsje,0 as skje,0 as qmye,qcfp,0 as fpje,0 as qmfpye '+
               ' from xsb '+
               ' union all  '+
               ' select ywy,0 as qc,0 as xsje,skje,0 as qmye,qcfp,0 as fpje,0 as qmfpye '+
               ' from skb '+
          ')org   '+
          ' where cplx='''+comcplx.Text+''' and ssyf='''+comssyf.Text+''''+
          ' group by ywy '); 编译后出错
    Invalid use of keyword
    Token :select
    Line Numbe:1
      

  4.   

    无效使用关键字。应是SQL语句写错了, 一下看不出来,你测试一下吧SQL.Add前面有什么吗?查一查sql.text中'select ywy,sum(qcye) as qc ,sum(ysje) as xsje,sum(je) as skje,'前面有什么没有,是不是没有清除。SQL语句最好先在SQL Studio中运行成功后再转入到Delphi
    你可以先测试中间那段
                select ywy,qc,0 as xsje,0 as skje,0 as qmye,qcfp,0 as fpje,0 as qmfpye 
                from yskqcye 
                union all  
                select ywy,0 as qc,xsje,0 as skje,0 as qmye,qcfp,0 as fpje,0 as qmfpye 
                from xsb 
                union all  
                select ywy,0 as qc,0 as xsje,skje,0 as qmye,qcfp,0 as fpje,0 as qmfpye 
                from skb 
    另外不建议   ' where cplx='''+comcplx.Text+''' and ssyf='''+comssyf.Text+''''这种写法。用Parameters
      

  5.   

    综合类汇总数据,往往通SQL不能问题。需要通过数据集循环,统计数据。
      

  6.   

    忘了说,我用的是很早的padradox数据库
    找不出原因procedure TForm1.comCplxChange(Sender: TObject);
    begin
      if comHzfs.Text='按业务员汇总' then
      begin
        with  data.xshz do
        begin
            close;
            Sql.Clear;
        SQL.Add('select ywy,sum(qcye) as qc ,sum(ysje) as xsje,sum(je) as skje, '+
                  ' sum(qcye)+sum(ysje)-sum(je) as qmye, '+
                  ' sum(qcfpje) as qcfp, sum(jshj) as fpje,'+
                  ' sum(qcfpje)+sum(ysje)-sum(jshj) as qmfpye '+
          ' from(  '+
               ' select ywy,qc,0 as xsje,0 as skje,0 as qmye,qcfp,0 as fpje,0 as qmfpye '+
               ' from yskqcye'+
               ' union all  '+
               ' select ywy,0 as qc,xsje,0 as skje,0 as qmye,0 as qcfp,0 as fpje,0 as qmfpye '+
               ' from xsb '+
               ' union all  '+
               ' select ywy,0 as qc,0 as xsje,skje,0 as qmye,0 as qcfp,0 as fpje,0 as qmfpye '+
               ' from skb '+
               ' union all  '+
               ' select ywy,0 as qc,0 as xsje,0 as skje,0 as qmye,0 as qcfp,fpje,0 as qmfpye '+
               ' from xxb '+
          ') org  '+
          ' where cplx=:cplx and ssyf=:ssyf '+
          ' group by ywy ');
          ParamByName('cplx').AsString:=comcplx.Text;
          ParamByName('ssyf').AsString:=comssyf.Text;
          open;
       end;
    end;end.
      

  7.   

    我试过,使用这样的SQL语法就要出错select  from  (select from  union  all select from)T
    难道paradox数据库不一样的?
      

  8.   

    如果Paradox不支持select  from  (select from  union  all select from)T
    那你把中间那段创建一个临时表吧