加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer之行列转换

发布时间:2020-12-12 15:04:06 所属栏目:MsSql教程 来源:网络整理
导读: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 '

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 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?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读