行列互转

定义:

Pivot英文意思:回转运动

PIVOT用于将列值旋转为列名(即行转列),

UNPIVOT用于将列名转为列值(即列转行),

也可以在SQL Server 2000可以用聚合函数配合CASE语句实现。

语法:

PIVOT和UNPIVOT的语法区别在于是否有使用聚合函数

PIVOT:

table_source
PIVOT(
聚合函数(value_column)
FOR pivot_column
IN(<column_list>)
)

UNPIVOT:

table_source
UNPIVOT(
value_column
FOR pivot_column
IN(<column_list>)
)

注意:

PIVOT、UNPIVOT是SQL Server 2005 的语法。

实例:

一、行转列

1、建立表格

if object_id(‘test‘)is not null drop table test
go
create table test(姓名 varchar(10),课程 varchar(10),分数 int)
insert into test values(‘张三‘,‘语文‘,65)
insert into test values(‘张三‘,‘数学‘,85)
insert into test values(‘张三‘,‘英语‘,70)
insert into test values(‘李四‘,‘语文‘,80)
insert into test values(‘李四‘,‘数学‘,71)
insert into test values(‘李四‘,‘英语‘,83)
go
select * from test

姓名         课程         分数

---------- ---------- -----------

张三         语文         65

张三         数学         85

张三         英语         70

李四         语文         80

李四         数学         71

李四         英语         83

(1)、通过聚合函数配合CASE语句实现:

select 姓名,
 max(case 课程 when ‘语文‘ then 分数 else 0 end)语文,
 max(case 课程 when ‘数学‘ then 分数 else 0 end)数学,
 max(case 课程 when ‘英语‘ then 分数 else 0 end)英语
from test
group by 姓名

(2)、通过pivot实现:

select * from test pivot(max(分数) for 课程 in (语文,数学,英语))p

得到的结果一致:

姓名         语文          数学          英语

---------- ----------- ----------- -----------

李四         80          71          83

张三         65          85          70

二、列转行

1、建立表格

if object_id(‘test‘)is not null drop table test
go
create table test(姓名 varchar(10),语文 int,数学 int,英语 int)
insert into test values(‘张三‘,65,85,70)
insert into test values(‘李四‘,80,71,83)
go
select * from test

姓名         语文          数学          英语

---------- ----------- ----------- -----------

张三         65          85          70

李四         80          71          83

(1)、通过聚合函数配合CASE语句实现:

select * from
(
 select 姓名,课程=‘语文‘,分数=语文 from test
 union all
 select 姓名,课程=‘数学‘,分数=数学 from test
 union all
 select 姓名,课程=‘物理‘,分数=英语 from test
) p
order by 姓名,case 课程 when ‘语文‘ then 1 when ‘数学‘ then 2 when ‘英语‘ then 3 end

姓名         课程   分数

---------- ---- -----------

李四         物理   83

李四         语文   80

李四         数学   71

张三         物理   70

张三         语文   65

张三         数学   85

(2)、通过pivot实现:

select 姓名,课程,分数 from test unpivot (分数 for 课程 in ([语文],[数学],[英语])) p

姓名         课程   分数

---------- ---- -----------

李四         物理   83

李四         语文   80

李四         数学   71

张三         物理   70

张三         语文   65

张三         数学   85

时间: 2024-11-02 17:45:49

行列互转的相关文章

关于SQLServer 中行列互转的实例说明

这几天在做一个招标系统中审批模块,其中关于报价信息这块,用到了pivot和unpivot来实现数据的行列互转,下面简单介绍一下,实际案例,便于回忆和记录相关的条件下使用的情况.pivot 与 unpivot 函数是SQL2005新提供的2个函数,PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合.UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值. 下面我通过PIVOT 来阐述整个函数的使用: 语

oracle进阶篇--行列互转

目前行列转换包括以下六种情况: 1.*列转行 2.*行转列 3.*多列转换成字符串 4.*多行转换成字符串 5.*字符串转换成多列 6.*字符串转换成多行 讨论的适用范围只包括8i,9i,10g及以后版本.begin: 1.列转行 CREATE TABLE t_col_row( ID INT, c1 VARCHAR2(10), c2 VARCHAR2(10), c3 VARCHAR2(10)); INSERT INTO t_col_row VALUES (1, 'v11', 'v21', 'v3

sql server 行列互转

create database Inter_Transformationgocreate table Tb(Uname varchar(30),Course varchar(30),Fraction int)goinsert into tb values('张三','语文',74) insert into tb values('张三','数学',83) insert into tb values('张三','物理',93) insert into tb values('李四','语文',74)

sql 行列互转

1.行转列 现有数据: 期望数据: 1.1建表建数据 IF OBJECT_ID('temp_20170701','u') IS NOT NULL DROP TABLE temp_20170701 CREATE TABLE temp_20170701 ( ID INT PRIMARY KEY IDENTITY(1,1), NAME NVARCHAR(50), Subjectname NVARCHAR(50), Score INT ) INSERT dbo.temp_20170701( Name,

Pivot行列互转

行转列,列转行,传统方式与pivot方式,不同的实现,同样的结果 最近在做考勤管理,有需要行转列的报表,CaseWhen老方法可以实现,但Pivot方法实现更为简便,以下是具体实现. 1 --行转列 2 create table T_1(Name varchar(10),LeaveType varchar(10), Days int) 3 4 insert into T_1 values('张三丰','病假',20) 5 insert into T_1 values('张无忌','婚假',3)

sql server pivot/unpivot 行列互转

有时候会碰到行转列的需求(也就是将列的值作为列名称),通常我都是用 CASE END + 聚合函数来实现的. 如下: declare @t table (StudentName nvarchar(20), Subject nvarchar(20), Score int) Insert into @t (StudentName,Subject,Score) values ( '学生A', '中文', 80 ); Insert into @t (StudentName,Subject,Score)

将二维数组中的行列互换

情景:二维数组可以存储表格数据,还可以根据下标索引加入各种运算,而且图片的关键运算方法也是以二维数组为基础进行矩阵运算的. //创建二维数组 int arr[][] = new int[][]{{1,2,3},{4,5,6},{7,8,9}}; System.out.println("行列互掉前:"); //输出二维数组 printArray(arr); int arr2[][] = new int[arr.length][arr.length]; //调整数组行列数据 for (in

Oracle 多行变一列的方法

多行变一列的方法有很多,觉得这个第一眼看懂了当时就用的这个办法. 情况是这样的.以下数据前几列是一样的,需要把VAT_VALUE_CHAR 的值放在同一行上. SELECT * FROM ps_vat_defaults defaults WHERE defaults.vat_driver = 'VAT_ENT_RGSTRN' AND defaults.vat_driver_key1 = 'AMB19' AND defaults.vat_driver_key2 = 'DEU' AND vat_de

你真的会玩SQL吗?透视转换

原文:你真的会玩SQL吗?透视转换 透视转换是一种行列互转的技术,在转过程中可能执行聚合操作,应用非常广泛. 本章与 你真的会玩SQL吗?数据聚合 内容比较重要,还涉及到 你真的会玩SQL吗?Case的用法 的内容,都可以一起看. 下面的例子将使用OpenSchema表,运行创建表: CREATE TABLE OpenSchema( objectid INT NOT NULL, attribute VARCHAR(30) NOT NULL , VALUE SQL_VARIANT NOT NULL