当前位置: 代码迷 >> Sql Server >> 一条sql语句,能搞定吗?解决办法
  详细解决方案

一条sql语句,能搞定吗?解决办法

热度:182   发布时间:2016-04-27 19:29:52.0
一条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 tbgroup 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 aset @sql = @sql + ' from tb group by 姓名 order by 姓名'exec(@sql) /*姓名         类别1数量       类别2数量       ---------- ----------- ----------- 小李         2           4小吴         3           0小张         12          21*/drop table tb
  相关解决方案