姓名 领取数量 操作类型
张三 12 领出
李四 1 领出
张三 5 退
陈军 3 领出
我想统计指定姓名某人总共领取的数量,例如对于张三,那么他总共领取数量是 7 (统计的时候应该减去 退 的数量),有没有办法使用1条sql语句搞定这个问题?
张三 12 领出
李四 1 领出
张三 5 退
陈军 3 领出
我想统计指定姓名某人总共领取的数量,例如对于张三,那么他总共领取数量是 7 (统计的时候应该减去 退 的数量),有没有办法使用1条sql语句搞定这个问题?
sum(case when 操作类型='领出' then 领取数量 else -领取数量 end )
from tb group by 姓名
姓名,sum(领出)-sum(退)
from
tb
group by
姓名
from tb where 姓名 = '张三'
group by 姓名
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 個資料列受到影響)
*/
select
姓名 , sum(case when 操作类型 = '领出' then 领取数量 when 操作类型 = '退' then - 领取数量 end ) as 数量
from
tb
where
姓名 = 'XX'
group by
姓名
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
--> 测试时间: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]
-----------------------------------------------
姓名 总共领取数量
-------------------------
陈军 10
李四 14
张三 7
from tb
group by 姓名select 姓名,sum(case 操作类型 when '领出' then 领取数量 else -领取数量 end) as 领取数量
from tb
group by 姓名/*
姓名 领取数量
---------- -----------
陈军 3
李四 1
张三 7
*/
from table1
group by 姓名
case 操作类型
when '领出' then
领取数量
else -领取数量
end
这样或许容易理解。