现在有一张货物流的表,是不同地点运送不同货物的记录,现在我需要把这张表的情况作个汇总,如:
A运往B品种1的货物有10件,而B运往A品种1的货物有6件,那么终于起来就是A运往B地品种1的货物4件.
如下面的表格
TYPE FROM TO AMOUNT
1 A B 10
1 B A 6
2 A B 3
2 B A 5
1 A C 4
1 A C 3汇总起来的需要得到的表格是:
TYPE FROM TO AMOUNT
1 A B 4(10-6)
2 A B -2(3-5)
1 A C 1(4-3)即以TYPE\FROM\TO GROUP起来的表格. A和B的位置可以FROM或TO都可,没有要求.即第一条也可以说B往A品种1共-4件.请问这种SQL语句怎么写?

解决方案 »

  1.   

    测试数据
    create table List(
    TypeID int,
    FromAdd varchar(10), 
    ToAdd varchar(10), 
    Amount int 
    )insert into List(TypeID, FromAdd, ToAdd, Amount)
    values (1, 'A', 'B', 10), 
    (1, 'B', 'A', 6),
    (2, 'A', 'B', 3),
    (2, 'B', 'A', 5),
    (1, 'A', 'C', 4),
    (1, 'C', 'A', 3)
    sql
    select identity(int, 1, 1)ID, TypeID, FromAdd, ToAdd, SUM(Amount) Amount
    into #tmp
    from List
    group by TypeID, FromAdd, ToAddselect T.TypeID, T.FromAdd, T.ToAdd, Amount
    into #To
    from #tmp T
    where not exists (select ID 
    from #tmp 
    where FromAdd = T.ToAdd and ToAdd = T.FromAdd and TypeID = T.TypeID and ID < T.ID)select T.TypeID, T.FromAdd, T.ToAdd, Amount
    into #Back
    from #tmp T
    where exists (select ID 
    from #tmp 
    where FromAdd = T.ToAdd and ToAdd = T.FromAdd and TypeID = T.TypeID and ID < T.ID)
    select T.TypeID, T.FromAdd, T.ToAdd, (T.Amount-isnull(B.Amount, 0)) Amount
    from #To T
    left join #Back B on T.TypeID = B.TypeID and T.FromAdd = B.ToAdd and T.ToAdd = B.FromAdddrop table #tmp
    drop table #To
    drop table #Back 
    结果
    TypeID FromAdd ToAdd Amount
    1 A B 4
    1 A C 1
    2 A B -2
      

  2.   


    create table t2 (typ int, f char(1), t char(1), AMOUNT int)insert into t2
    select 1, 'A', 'B', 10 union 
    select 1, 'B', 'A', 6 union
    select 2, 'A', 'B', 3 union
    select 2, 'B', 'A', 5 union
    select 1, 'A', 'C', 4 union
    select 1, 'C', 'A', 3select a.typ, a.f, a.t, a.AMOUNT-b.AMOUNT AMOUNT
    from t2 a
    inner join t2 b
    on a.typ=b.typ and a.f=b.t and a.t=b.f
    where a.f='A' and b.t='A'typ         f    t    AMOUNT
    ----------- ---- ---- -----------
    1           A    B      4
    1           A    C      1
    2           A    B      -2