use test
go
if object_id('test.dbo.tb') is not null drop table tb
go
-- 创建数据表
create table tb
(
姓名 varchar(8),
课程 varchar(10),
分数 int
)
go
--测试数据
insert into tb
select '张三','语文',80 union all
select '张三','数学',91 union all
select '张三','物理',75 union all
select '李四','语文',77 union all
select '李四','数学',80 union all
select '李四','物理',75
go
--select * from tb
/*
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
*/
--代码实现
select 姓名,
(case 课程 when '语文' then 分数 else 0 end) 语文,
(case 课程 when '数学' then 分数 else 0 end) 数学,
(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
/*测试结果
姓名 语文 数学 物理
--------------------------
张三 80 0 0
张三 0 91 0
张三 0 0 75
李四 77 0 0
李四 0 80 0
李四 0 0 75
(6 行受影响)
*/
--这里为了让每个人的数据单行显示,所以就以"姓名"分组统计,
--可以使用max,也可以使用sum. 因为 0 在这里不影响统计结果
select 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名
--------------------------------------------------------------------------
select 姓名,
sum(case 课程 when '语文' then 分数 else 0 end) 语文,
sum(case 课程 when '数学' then 分数 else 0 end) 数学,
sum(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名
--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)
/*测试结果
姓名 语文 数学 物理
--------------------------
李四 77 80 75
张三 80 91 75
(2 行受影响)
*/
============================================================
declare @a table (id int,aa int)
insert into @a
select 1,1 union all
select 1,0 union all
select 2,0 union all
select 2,0 union all
select 3,1 union all
select 3,1 union all
select 3,0
select * from @a
select id,
(CASE aa WHEN 1 THEN 1 ELSE 0 END) AS '1',
(CASE aa WHEN 0 THEN 1 ELSE 0 END) AS '0'
from @a
select id,
SUM(CASE aa WHEN 1 THEN 1 ELSE 0 END) AS '1',
SUM(CASE aa WHEN 0 THEN 1 ELSE 0 END) AS '0'
from @a GROUP BY id
select id,
max(CASE aa WHEN 1 THEN 1 ELSE 0 END) AS '1',
max(CASE aa WHEN 0 THEN 1 ELSE 0 END) AS '0'
from @a GROUP BY id
/*
1 1
1 0
2 0
2 0
3 1
3 1
3 0
1 1 0
1 0 1
2 0 1
2 0 1
3 1 0
3 1 0
3 0 1
1 1 1
2 0 2
3 2 1
1 1 1
2 0 1
3 1 1
*/
PS:
http://topic.csdn.net/u/20080920/15/61bf31bf-518c-41be-9e4a-b166c878dcaf.html?12972