create table baoguan(外销发票号 varchar(20),核销单号 varchar(20),报关金额 decimal(18,2))
insert into baoguan values('126HFGY10001', '715890166', 17228.16)
insert into baoguan values('126HFGY10002', '715911629', 6372)
create table shoukuan(核销单号 varchar(20),收汇日 datetime,收汇金额 decimal(18,2),汇率 decimal(18,4),结汇 decimal(18,2))
insert into shoukuan values('715890166','2007-02-22', 10879.38 ,6.8132 ,74123.39)  
insert into shoukuan values('715890166','2010-01-22', 6323     ,6.8258 ,43159.53)  
insert into shoukuan values('715911629','2010-02-11', 1901.6   ,6.8121 ,12955.98)  
insert into shoukuan values('715911629','2010-04-02', 4450.4   ,6.8121 ,30316.57)  
insert into shoukuan values('715911629','2010-06-25', 10000   ,6.8121 ,68258)      
create table fukuan(核销单号 varchar(20),付款日 datetime,已付金额 decimal(18,2))
insert into fukuan values('715890166','2010-05-22',10000)                          
insert into fukuan values('715890166','2010-06-22',879.38)                         
insert into fukuan values('715890166','2010-07-22',6323)                           
insert into fukuan values('715911629','2010-05-25',110955)                         
insert into fukuan values('715911629','2010-06-25',258.55)以上是测试数据,查询代码如下:select case when 收汇日 = (select top 1 收汇日 from 
(
  select t1.*,t2.收汇日,t2.收汇金额,t2.汇率,t2.结汇,t3.付款日,t3.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
   union 
  select t1.*,t3.收汇日,t3.收汇金额,t3.汇率,t3.结汇,t2.付款日,t2.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
) b1 where b1.核销单号 = a1.核销单号 and b1.收汇日<>'' order by b1.收汇日) then a1.外销发票号 
when 付款日 = (select top 1 付款日 from 
(
  select t1.*,t2.收汇日,t2.收汇金额,t2.汇率,t2.结汇,t3.付款日,t3.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
   union
  select t1.*,t3.收汇日,t3.收汇金额,t3.汇率,t3.结汇,t2.付款日,t2.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
) c1 where c1.核销单号 = a1.核销单号 and c1.付款日<>'' order by c1.付款日) then a1.外销发票号 else '' end 外销发票号,
       case when 收汇日 = (select top 1 收汇日 from 
(
  select t1.*,t2.收汇日,t2.收汇金额,t2.汇率,t2.结汇,t3.付款日,t3.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
   union
  select t1.*,t3.收汇日,t3.收汇金额,t3.汇率,t3.结汇,t2.付款日,t2.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
) b2 where b2.核销单号 = a1.核销单号 and b2.收汇日<>'' and b2.收汇日 is not null order by b2.收汇日) then a1.核销单号 
when 付款日 = (select top 1 付款日 from 
(
  select t1.*,t2.收汇日,t2.收汇金额,t2.汇率,t2.结汇,t3.付款日,t3.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
   union
  select t1.*,t3.收汇日,t3.收汇金额,t3.汇率,t3.结汇,t2.付款日,t2.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
) c2 where c2.核销单号 = a1.核销单号 and c2.付款日<>'' order by c2.付款日) then a1.核销单号 else '' end 核销单号,
  case when 收汇日 = (select top 1 收汇日 from 
(
  select t1.*,t2.收汇日,t2.收汇金额,t2.汇率,t2.结汇,t3.付款日,t3.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
   union
  select t1.*,t3.收汇日,t3.收汇金额,t3.汇率,t3.结汇,t2.付款日,t2.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
) b3 where b3.核销单号 = a1.核销单号 and b3.收汇日<>'' and b3.收汇日 is not null order by b3.收汇日) then cast(a1.报关金额 as varchar)
when 付款日 = (select top 1 付款日 from 
(
  select t1.*,t2.收汇日,t2.收汇金额,t2.汇率,t2.结汇,t3.付款日,t3.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
   union
  select t1.*,t3.收汇日,t3.收汇金额,t3.汇率,t3.结汇,t2.付款日,t2.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
) c3 where c3.核销单号 = a1.核销单号 and c3.付款日<>'' order by c3.付款日) then cast(a1.报关金额 as varchar) else '' end 报关金额,
       收汇日,收汇金额,汇率,结汇,isnull(convert(varchar(10),付款日,120),'') 付款日,已付金额
from

  select t1.*,t2.收汇日,t2.收汇金额,t2.汇率,t2.结汇,t3.付款日,t3.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
   union
  select t1.*,t3.收汇日,t3.收汇金额,t3.汇率,t3.结汇,t2.付款日,t2.已付金额 from baoguan t1 left join
  (select t.* , px = (select count(1) from fukuan where 核销单号 = t.核销单号 and 付款日 < t.付款日) + 1 from fukuan t) t2 on t1.核销单号 = t2.核销单号 left join
  (select t.* , px = (select count(1) from shoukuan where 核销单号 = t.核销单号 and 收汇日 < t.收汇日) + 1 from shoukuan t) t3 on t1.核销单号 = t3.核销单号 and t2.px = t3.px
) a1
order by a1.收汇日,a1.付款日 drop table baoguan,shoukuan,fukuan想得到如下结果:外销发票号    核销单号   报关金额 收汇日      收汇金额  汇率    结汇      付款日      已付金额
126HFGY10001  715890166  17228.16 2007-02-22  10879.38  6.8132  74123.39  2010-05-22  10000.00
                                  2010-01-22   6323.00  6.8258  43159.53  2010-06-22    879.38  
                                                                          2010-07-22   6323.00
小结                                          17202.38         117282.92              17202.38
126HFGY10002  715911629   6372.00 2010-02-11   1901.60  6.8121  12955.98  2010-05-25 110955.00
                                  2010-04-02   4450.40  6.8121  30316.57  2010-06-25    258.55
                                  2010-06-25  10000.00  6.8121  68258.00
小结                                          16352.00         111530.55             111213.55    

解决方案 »

  1.   

    把小结按照核销单号统计出来,然后用union all合并数据.
      

  2.   

    自己做一个crystal report吧。
      

  3.   

    select id,(case when 外销发票号 = (select 外销发票号 from 
    (select row_number() over (ORDER BY a.核销单号) as id,a.外销发票号
    from baoguan a,shoukuan b,fukuan c
    where a.核销单号=b.核销单号
    and a.核销单号=c.核销单号) z
    where z.id = x.id - 1) then '' else 外销发票号 end) as 外销发票号,
    收汇金额
    from (select row_number() over (ORDER BY a.核销单号) as id,a.外销发票号,b.收汇金额
    from baoguan a,shoukuan b,fukuan c
    where a.核销单号=b.核销单号
      and a.核销单号=c.核销单号) x--提供一段SQL,算是个思路吧,给楼主参考
    --全部都写,实在太费时间了
    --------------------------------------------
    1 126HFGY10001 10879.38
    2 6323.00
    3 10879.38
    4 6323.00
    5 10879.38
    6 6323.00
    7 126HFGY10002 1901.60
    8 4450.40
    9 10000.00
    10 1901.60
    11 4450.40
    12 10000.00