SQLServer之行列转换

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 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值