有A表(表示进的数量) 
日期          单号      客户     进数 
2007-7-1    A0001    a1      20 
2007-7-1    A0002    a1      25 
2007-7-3    A0003    a1      100 
有B表(表示出的数量) 
日期          单号      客户     出数 
2007-7-1    B0001    a1      10 
2007-7-1    B0002    a1      15 
2007-7-3    B0003    a1      90 根据A,B两个表汇总的如下数据 
  日期        单号      客户     进数       出数     剩余 
2007-7-1    A0001    a1      20               20  
2007-7-1    A0002    a1      25               45 
2007-7-1    B0001    a1               10      35  
2007-7-1    B0002    a1               15      20 
2007-7-3    A0003    a1      100              120 
2007-7-3    B0003    a1               90      30 
想了好多天都弄不出来,高手帮忙啊 

解决方案 »

  1.   

    select 日期,单号,客户,进数,出数,
           (select sum(数量)
            from (select 进数 as 数量 from A表 where 日期<=a.日期 and 单号<a.单号
                  union all
                  select -出数 as 数量 from B表 where 日期<=a.日期 and 单号<a.单号
                 ) b
           ) as 剩余
    from (select 日期,单号,客户,进数,0 as 出数 from A表
          union all
          select 日期,单号,客户,0 as 进数,出数 from B表
         ) a
    order by 日期,单号
      

  2.   

    如果有一定的数据量,把 ... union all ... 这部分改成临时表或CTE(SQL2005)会快一点
      

  3.   

    -->生成测试数据
     
    declare @A table([日期] Datetime,[单号] nvarchar(5),[客户] nvarchar(2),[进数] int)
    Insert @A
    select '2007-7-1',N'A0001',N'a1',20 union all
    select '2007-7-1',N'A0002',N'a1',25 union all
    select '2007-7-3',N'A0003',N'a1',100
    --Select * from @A
    declare @B table([日期] Datetime,[单号] nvarchar(5),[客户] nvarchar(2),[出数] int)
    Insert @B
    select '2007-7-1',N'B0001',N'a1',10 union all
    select '2007-7-1',N'B0002',N'a1',15 union all
    select '2007-7-3',N'B0003',N'a1',90
    --Select * from @BSELECT T.*,
    (SELECT SUM(A.[进数]) -SUM(A.[出数]) FROM (SELECT [日期],[单号],[客户],[进数], 0 AS [出数] FROM @A
    UNION ALL 
    SELECT [日期],[单号],[客户],0 AS [进数], [出数] FROM @B ) A WHERE (A.[日期] < T.[日期]) OR( A.[日期] = T.[日期] AND A.[单号] <= T.[单号]) ) AS balance
     FROM 
    (SELECT [日期],[单号],[客户],[进数], 0 AS [出数] FROM @A
    UNION ALL 
    SELECT [日期],[单号],[客户],0 AS [进数], [出数] FROM @B
    )T
    ORDER BY [日期],[单号]
    /*
    日期                      单号    客户   进数          出数          balance
    ----------------------- ----- ---- ----------- ----------- -----------
    2007-07-01 00:00:00.000 A0001 a1   20          0           20
    2007-07-01 00:00:00.000 A0002 a1   25          0           45
    2007-07-01 00:00:00.000 B0001 a1   0           10          35
    2007-07-01 00:00:00.000 B0002 a1   0           15          20
    2007-07-03 00:00:00.000 A0003 a1   100         0           120
    2007-07-03 00:00:00.000 B0003 a1   0           90          30
    */
      

  4.   

    -->生成测试数据
     
    declare @A table([日期] Datetime,[单号] nvarchar(5),[客户] nvarchar(2),[进数] int)
    Insert @A
    select '2007-7-1',N'A0001',N'a1',20 union all
    select '2007-7-1',N'A0002',N'a1',25 union all
    select '2007-7-3',N'A0003',N'a1',100
    --Select * from @A
    declare @B table([日期] Datetime,[单号] nvarchar(5),[客户] nvarchar(2),[出数] int)
    Insert @B
    select '2007-7-1',N'B0001',N'a1',10 union all
    select '2007-7-1',N'B0002',N'a1',15 union all
    select '2007-7-3',N'B0003',N'a1',90
    --Select * from @BSELECT T.*,
    (SELECT SUM(A.[进数]) -SUM(A.[出数]) FROM (SELECT [日期],[单号],[客户],[进数], 0 AS [出数] FROM @A
    UNION ALL 
    SELECT [日期],[单号],[客户],0 AS [进数], [出数] FROM @B ) A WHERE (A.[日期] < T.[日期]) OR( A.[日期] = T.[日期] AND A.[单号] <= T.[单号]) ) AS balance
     FROM 
    (SELECT [日期],[单号],[客户],[进数], 0 AS [出数] FROM @A
    UNION ALL 
    SELECT [日期],[单号],[客户],0 AS [进数], [出数] FROM @B
    )T
    ORDER BY [日期],[单号]
    /*
    日期                      单号    客户   进数          出数          balance
    ----------------------- ----- ---- ----------- ----------- -----------
    2007-07-01 00:00:00.000 A0001 a1   20          0           20
    2007-07-01 00:00:00.000 A0002 a1   25          0           45
    2007-07-01 00:00:00.000 B0001 a1   0           10          35
    2007-07-01 00:00:00.000 B0002 a1   0           15          20
    2007-07-03 00:00:00.000 A0003 a1   100         0           120
    2007-07-03 00:00:00.000 B0003 a1   0           90          30
    */呵呵 和尚你太早了吧周末也在 都没日没夜的 帮人家  真热心啊