姓名  领取数量   操作类型
张三     12 领出 
李四     1 领出
张三     5  退
陈军     3        领出
我想统计指定姓名某人总共领取的数量,例如对于张三,那么他总共领取数量是 7 (统计的时候应该减去 退 的数量),有没有办法使用1条sql语句搞定这个问题?

解决方案 »

  1.   

    select 姓名,
           sum(case when 操作类型='领出' then 领取数量 else -领取数量 end )
    from tb group by 姓名
      

  2.   

    select
      姓名,sum(领出)-sum(退)
    from
      tb
    group by
      姓名
      

  3.   

    select 姓名 , 数量 = sum(case when 操作类型 = '领出' then 领取数量 when 操作类型 = '退' then - 领取数量 end )
    from tb where 姓名 = '张三'
    group by 姓名
      

  4.   

    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb] (姓名 nvarchar(4),领取数量 int,操作类型 nvarchar(4))
    insert into [tb]
    select N'张三',12,N'领出' union all
    select N'李四',1,N'领出' union all
    select N'张三',5,N'退' union all
    select N'陈军',3,N'领出'
    select 姓名,
           sum(case when 操作类型=N'领出' then 领取数量 else -领取数量 end )總數
    from tb group by 姓名
    /*
    姓名   總數
    ---- -----------
    李四   1
    张三   7
    陈军   3(3 個資料列受到影響)
    */
      

  5.   

    --写错 修改
    select
     姓名 , sum(case when 操作类型 = '领出' then 领取数量 when 操作类型 = '退' then - 领取数量 end ) as 数量 
    from 
     tb 
    where 
     姓名 = 'XX'
    group by
     姓名
      

  6.   

    create table tb(姓名 varchar(10), 领取数量 int, 操作类型 varchar(10))
    insert into tb values('张三' , 12, '领出') 
    insert into tb values('李四' , 1 , '领出') 
    insert into tb values('张三' , 5 , '退') 
    insert into tb values('陈军' , 3 , '领出')
    goselect 姓名 , 数量 = sum(case when 操作类型 = '领出' then 领取数量 when 操作类型 = '退' then - 领取数量 end )
    from tb where 姓名 = '张三'
    group by 姓名
    /*
    姓名         数量          
    ---------- ----------- 
    张三         7(所影响的行数为 1 行)
    */select 姓名 , 数量 = sum(case when 操作类型 = '领出' then 领取数量 when 操作类型 = '退' then - 领取数量 end )
    from tb 
    group by 姓名
    /*
    姓名         数量          
    ---------- ----------- 
    陈军         3
    李四         1
    张三         7(所影响的行数为 3 行)
    */drop table tb 
      

  7.   


    --> 测试时间:2009-12-16 16:18:56--> 我的淘宝:《戒色坊》http://shop36766744.taobao.com/if object_id('[TB]') is not null drop table [TB]
    create table [TB]([姓名] varchar(4),[领取数量] int,[操作类型] varchar(4))
    insert [TB]
    select '张三',12,'领出' union all
    select '李四',1,'领出' union all
    select '张三',5,'退' union all
    select '陈军',3,'领出'select *, from TBselect 姓名,领取数量=sum(领取数量*isnull(nullif(isnull(nullif(操作类型,'退'),-1),'领出'),1)) from [TB]
    group by 姓名/*姓名   领取数量        
    ---- ----------- 
    陈军   3
    李四   1
    张三   7(所影响的行数为 3 行)*/drop table [TB]
      

  8.   

    select 姓名,sum(case 操作类型 when '领出' then 领取数量 when '退' then -领取数量 end) as 总共领取数量 from tb group by 姓名
    -----------------------------------------------
    姓名     总共领取数量
    -------------------------
    陈军 10
    李四 14
    张三 7
      

  9.   

    select 姓名,sum(领取数量*(case 操作类型 when '领出' then 1 else -1 end)) as 领取数量
    from tb
    group by 姓名select 姓名,sum(case 操作类型 when '领出' then 领取数量 else -领取数量 end) as 领取数量
    from tb
    group by 姓名/*
    姓名         领取数量
    ---------- -----------
    陈军         3
    李四         1
    张三         7
    */
      

  10.   

    ---------------------------------------------------------------------------------case when 操作类型 = '领出' then 领取数量 when 操作类型 = '退' then - 领取数量 end 能解释一下为什么 操作类型 = '领出' 表示合计 领取数量,如果 操作类型 = '退' ,表示合计 -领取数量?? 不太明白
      

  11.   

    select 姓名,sum(case 操作类型 when '领出' then 领取数量 else -领取数量 end)
    from table1
    group by 姓名

    case 操作类型 
    when '领出' then 
    领取数量 
    else -领取数量 
    end

    这样或许容易理解。