SQL 列转行、行转列

本文介绍如何在SQL中实现数据的行转列和列转行操作,包括使用CASE WHEN语句和PIVOT函数进行行转列的方法,以及通过UNION ALL和UNPIVOT函数实现列转行的技巧。
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值