SQL 列转行、行转列

  1. 云栖社区>
  2. 博客>
  3. 正文

SQL 列转行、行转列

墨云天 2016-05-09 17:47:01 浏览5302
展开阅读全文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
一、行转列
 
create TAble TA (NAME    varchar(10) ,SUBJECT varchar(10) ,RESULT  int)
  
insert into TA(NAME , SUBJECT , RESULT) values('张三' '语文' , 74)
insert into TA(NAME , SUBJECT , RESULT) values('张三' '数学' , 83)
insert into TA(NAME , SUBJECT , RESULT) values('张三' '物理' , 93)
insert into TA(NAME , SUBJECT , RESULT) values('李四' '语文' , 74)
insert into TA(NAME , SUBJECT , RESULT) values('李四' '数学' , 84)
insert into TA(NAME , SUBJECT , RESULT) values('李四' '物理' , 94)
go
  
select from TA
 
--方法一:使用case when end结构
select NAME 姓名,
  max(case SUBJECT when '语文' then RESULT else end) 语文,
  max(case SUBJECT when '数学' then RESULT else end) 数学,
  max(case SUBJECT when '物理' then RESULT else end) 物理
from TA
group by NAME
 
--方法二:PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现
select from TA pivot(max(RESULT) for SUBJECT in (语文,数学,物理))a



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
二、列转行
 
CREATE TABLE TB (NAME VARCHAR(20), 语文 INT, 数学 INT, 物理 INT)
 
INSERT INTO TB VALUES('张三', 88,99,89);
INSERT INTO TB VALUES('李四', 78,77,87);
GO
 
SELECT FROM TB
 
--方法一:
select from 
(select NAME,'语文' AS 科目,语文 as 分数 from TB 
 union all
 select NAME,'数学' AS 科目,数学 as 分数 from TB 
 union all
 select NAME,'物理' AS 科目,物理 as 分数 from TB
AS t
 
--方法二:使用unpivot函数
SELECT NAME,科目,分数 FROM TB UNPIVOT(分数 for 科目 in (语文,数学,物理))b

网友评论

登录后评论
0/500
评论
墨云天
+ 关注