查询问题  
表hygl                        hyh    mgz    (合约管理)  
表caiwu                      id      hyh    total    c_date(施工队获得的财务款)  
表d_material_out    id      hyh    total    out_date(施工队耗用材料款)  
表nb_jl            id      hyh    total    jl_date  (内部计量,确定施工队的总计应得收入)  
 
查询的结果格式为  
合约号  施工队伍  本期应支付  本期实际支付  至上期欠付  累计20%未支付  
hyh       mgz      
耗用材料款  累计欠付金额  
 
说明:本期应支付是:    内部计量*80%    
           本期实际支付  :施工队获得的财务款  
 现在要统计出:1.某年某月  2.连续的一段时间(以月为单位)  
 

解决方案 »

  1.   

    问题本人刚刚已经解决,总算放下重担了,但是还是想各位能够提出更加好的方法,共同学习一下!!照样给分,希望大家踊跃参加!下面是我得到的最后解决问题的代码!!不足之处请各位指正,谢谢!
    close;
     sql.Clear;
     sql.Add('select hygl.hyh,hygl.mgz,');
     sql.Add(' bqyzf=0.8*(select sum(total) from nb_jl');
     sql.Add(' where hygl.hyh=nb_jl.hyh and year(jl_date)='+#39+Edit2.Text+#39'');
     sql.Add('and month(jl_date)='+#39+Combobox2.Text+#39'),');
     sql.Add(' bqsjzf=(select sum(caiwu.total)  from caiwu ');
     sql.Add(' where hygl.hyh=caiwu.hyh');
     sql.Add(' and year(caiwu.c_date)='+#39+Edit2.Text+#39'');
     sql.Add('and month(caiwu.c_date)='+#39+Combobox2.Text+#39'),');
     sql.Add(' zsqqf=(0.8*(select sum(nb_jl.total) from nb_jl');
     sql.Add(' where hygl.hyh=nb_jl.hyh and (year(nb_jl.jl_date)<'+#39+Edit2.Text+#39'');
     sql.Add('or month(nb_jl.jl_date)<'+#39+Combobox2.Text+#39' and year(nb_jl.jl_date)='+#39+Edit2.Text+#39'))');
     sql.Add('-(select sum(caiwu.total)  from caiwu');
     sql.Add('where hygl.hyh=caiwu.hyh');
     sql.Add('and (year(caiwu.c_date)<'+#39+Edit2.Text+#39' or ');
     sql.Add(' year(caiwu.c_date)='+#39+Edit2.Text+#39'');
     sql.Add('and month(caiwu.c_date)<'+#39+Combobox2.Text+#39'))),');
     sql.Add('ljbfwzf=0.2*(select sum(nb_jl.total) from nb_jl');
     sql.Add('where hygl.hyh=nb_jl.hyh');
     sql.Add('and (year(nb_jl.jl_date)<'+#39+Edit2.Text+#39'');
     sql.Add('or year(nb_jl.jl_date)='+#39+Edit2.Text+#39'');
     sql.Add('and month(nb_jl.jl_date)<='+#39+Combobox2.Text+#39')),');
     sql.Add('ljclk=(select sum(d_material_out.total) from d_material_out');
     sql.Add('where hygl.hyh=d_material_out.hyh');
     sql.Add('and (year(d_material_out.out_date)<'+Edit2.Text+'');
     sql.Add('or year(d_material_out.out_date)='+#39+Edit2.Text+#39'');
     sql.Add('and month(d_material_out.out_date)<='+#39+Combobox2.Text+#39'))');
     sql.Add('from hygl');
     sql.Add('group by hygl.hyh,hygl.mgz');
     prepared;
     open;
      

  2.   

    我个人认为先生成sql语句,然后在赋值给query比较好,至少在调试时速度快些。
      

  3.   

    hncx (delphi菜鸟) 好人,可以学习一下!
      

  4.   

    我是想把这个查询的结果先显示在一个dbgrid上面,再打印,关联查询打印的时候可能要出问题,就是要采用主/从表的方法打印,达不到预期的报表所要求的效果。
      

  5.   


     sql.Add('from hygl');
     sql.Add('group by hygl.hyh,hygl.mgz');
     prepared;                   //请楼主给解释这句是什么意思
     open;
      

  6.   

    hygl 是合约管理表,他的主键是hyh,其它的几个表中也都有合约号,不过不是主键,就是通过它hyh根其它表关联,如内部计量*80%就是应付款,如果合约管理表中没有这个合约号的话就不对他做统计,group 
    sql.Add('group by hygl.hyh,hygl.mgz');
    //是按照hygl表中的hyh(合约号),mgz(施工队伍)进行分组,不包含在聚合函数里面的字段都要分组的
     
    prepared//我用的是adoquery
     open;//打开数据集
      

  7.   

    我学delphi才一个月,sql也一样,其实我也不太明白sql中的分组查询所以才来请教大家的,不过结果是对的,这是经过我试验了两天的成果,不弄清楚觉得很没有劲,希望各位能够多多指教。