日期:2014-05-18  浏览次数:20536 次

一条sql语句,能搞定吗?
姓名 类别 数量
小张 1 12
小张 2 21
小李 1 2
小李 2 4
小吴 1 3
一条sql语句出来的结构是: 
姓名 类别1数量 类别2数量
小张 12 21
小李 2 4
小吴 1 0


------解决方案--------------------
select 姓名,
sum(case 类别 when 1 then 数量 else 0 end) '类别1数量',
sum(case 类别 when 2 then 数量 else 0 end) '类别2数量'
from tb
group by 姓名

------解决方案--------------------
select 姓名,sum(case 类别 when '2' then 数量 else 0 end) '类别2数量' from 表 group by 姓名
------解决方案--------------------
create table tb(姓名 varchar(10),类别 int,数量 int)
insert into tb values('小张', 1, 12) 
insert into tb values('小张', 2, 21) 
insert into tb values('小李', 1, 2 )
insert into tb values('小李', 2, 4 )
insert into tb values('小吴', 1, 3 )
go
--静态SQL,指类别只有1,2两种情况
select 姓名,
sum(case 类别 when 1 then 数量 else 0 end) '类别1数量',
sum(case 类别 when 2 then 数量 else 0 end) '类别2数量'
from tb
group by 姓名
order by 姓名
/*
姓名 类别1数量 类别2数量
---------- ----------- ----------- 
小李 2 4
小吴 3 0
小张 12 21
*/

--动态SQL,指类别不止1,2两种情况
declare @sql varchar(8000)
set @sql = 'select 姓名'
select @sql = @sql + ' , sum(case 类别 when ''' + cast(类别 as varchar) + ''' then 数量 else 0 end) [类别' + cast(类别 as varchar) + '数量]'
from (select distinct 类别 from tb) as a
set @sql = @sql + ' from tb group by 姓名 order by 姓名'
exec(@sql) 
/*
姓名 类别1数量 类别2数量
---------- ----------- ----------- 
小李 2 4
小吴 3 0
小张 12 21
*/

drop table tb


------解决方案--------------------
SQL code
create table tb(姓名 varchar(10),类别 int,数量 int)
insert into tb values('小张', 1, 12) 
insert into tb values('小张', 2, 21) 
insert into tb values('小李', 1, 2 )
insert into tb values('小李', 2, 4 )
insert into tb values('小吴', 1, 3 )
go
--静态SQL,指类别只有1,2两种情况
select 姓名,
  sum(case 类别 when 1 then 数量 else 0 end) '类别1数量',
  sum(case 类别 when 2 then 数量 else 0 end) '类别2数量'
from tb
group by 姓名
order by 姓名
/*
姓名         类别1数量       类别2数量       
---------- ----------- ----------- 
小李         2           4
小吴         3           0
小张         12          21
*/

--动态SQL,指类别不止1,2两种情况
declare @sql varchar(8000)
set @sql = 'select 姓名'
select @sql = @sql + ' , sum(case 类别 when ''' + cast(类别 as varchar) + ''' then 数量 else 0 end) [类别' + cast(类别 as varchar) + '数量]'
from (select distinct 类别 from tb) as a
set @sql = @sql + ' from tb group by 姓名 order by 姓名'
exec(@sql) 
/*
姓名         类别1数量       类别2数量       
---------- ----------- ----------- 
小李         2           4
小吴         3           0
小张         12          21
*/

drop table tb