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)
 6 insert into T_1 values(‘萧峰‘,‘探亲假‘,30)
 7 insert into T_1 values(‘段誉‘,‘事假‘,2)
 8 insert into T_1 values(‘虚竹‘,‘事假‘,3)
 9
10 select * from T_1
11
12 --case when 老用法
13 select Name,
14
15  max(case LeaveType when ‘病假‘ then Days else 0 end) 病假,
16  max(case LeaveType when ‘婚假‘ then Days else 0 end) 婚假,
17  max(case LeaveType when ‘探亲假‘ then Days else 0 end) 探亲假,
18  max(case LeaveType when ‘事假‘ then Days else 0 end) 事假
19 from T_1
20 group by Name
21
22 --case when 动态老用法
23 declare @sqlstr varchar(600)
24
25 set @sqlstr=‘select Name‘
26 select @sqlstr=@sqlstr+‘,max(case LeaveType when ‘‘‘+LeaveType+‘‘‘ then Days else 0 end) [‘+LeaveType+‘]‘
27 from(select distinct LeaveType from T_1) a
28 set @sqlstr=@sqlstr+ ‘ from T_1 group by Name‘
29 exec(@sqlstr)
30
31 -- 使用新用法pivot
32 select * from T_1 pivot(max(Days) for LeaveType in (病假,婚假,探亲假,事假)) a
33
34 --使用新用法pivot动态
35
36 declare @sqlstr varchar(6000)
37
38 set @sqlstr=‘‘
39 select @sqlstr=@sqlstr+‘,‘+LeaveType from T_1 group by LeaveType
40 set @sqlstr=stuff(@sqlstr,1,1,‘‘)
41 set @sqlstr=‘select * from T_1 pivot (max(Days) for LeaveType in (‘+@sqlstr+‘)) a‘
42 exec(@sqlstr)
43
44 --列转行
45
46 create table T_2(Name varchar(10),病假 int,婚假 int,事假 int, 探亲假 int)
47
48 insert into T_2 values(‘段誉‘,0,0,2,0)
49 insert into T_2 values(‘萧峰‘,0,0,0,30)
50 insert into T_2 values(‘虚竹‘,0,0,3,0)
51 insert into T_2 values(‘张三丰‘,20,0,0,0)
52 insert into T_2 values(‘张无忌‘,0,3,0,0)
53
54 select * from T_2
55
56 --老方法 case when
57 select * from(
58  select Name,LeaveType=‘病假‘,Days=病假 from T_2
59  union all
60  select Name,LeaveType=‘婚假‘,Days=婚假 from T_2
61  union all
62  select Name,LeaveType=‘事假‘,Days=事假 from T_2
63  union all
64  select Name,LeaveType=‘探亲假‘,Days=探亲假 from T_2) t
65  where t.Days <> 0
66  order by Name
67
68  --老方法 case when 动态
69
70 declare @sqlstr varchar(6000)
71 select @sqlstr= isnull(@sqlstr+‘ union all ‘,‘‘)+‘ select Name, [LeaveType]=‘
72 +quotename(Name,‘‘‘‘)+‘ , [Days] = ‘+quotename(Name)+‘ from T_2‘
73 from syscolumns
74 where Name!=‘Name‘ and ID=object_id(‘T_2‘) --表名tb,不包含列名为姓名的其他列
75 order by colid
76 exec(‘select * from (‘+@sqlstr+‘)t where Days <> 0 order by Name‘)
77
78 select * from syscolumns where ID=object_id(‘T_2‘)
79
80 --新方法 pivot
81
82 select * from T_2
83
84 select Name,LeaveType,Days from T_2 unpivot (Days for LeaveType in([病假],[婚假],[事假],[探亲假])) t
85 where days <> 0
86
87 --新方法 pivot 动态
88
89 declare @sqlstr varchar(6000)
90 select @sqlstr=isnull(@sqlstr+‘,‘,‘‘)+quotename(Name)
91 from syscolumns
92 where ID=object_id(‘T_2‘)and Name not in(‘Name‘)
93 order by Colid
94 set @sqlstr=‘select Name,[LeaveType],[Days] from T_2 unpivot ([Days] for [LeaveType] in(‘+@sqlstr+‘)) b where days<> 0‘
95 exec(@sqlstr)

时间: 2024-08-27 16:39:09

Pivot行列互转的相关文章

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

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

SQL中PIVOT 行列转换

SQL中PIVOT 行列转换 本文导读:T-SQL语句中,Pivot运算符用于在列和行之间对数据进行旋转或透视转换,PIVOT命令可以实现数据表的列转行,同时执行聚合运算,UNPIVOT则与其相反,实现数据的行转列. PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合.UNPIVOT与PIVOT执行相反的操作,将表值表达式的列转换为列值. 通俗简单的说:PIVOT就是行转列,UNPIVOT就是列传行 一.PIVOT实例 1

T-SQL PIVOT 行列转换

前面几个例子: http://www.cnblogs.com/insus/articles/1969896.html http://www.cnblogs.com/insus/articles/1970577.html http://www.cnblogs.com/insus/articles/1970707.html 全是SQL Server行列转换或是列行转换的相关例子.不过在SQL Server2005版本开始,有一个新的函数PIVOT()可以很轻易实现这些功能.参考下面代码: SELEC

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)

SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句

先看常用的一种表结构设计方式: 那么可能会遇到一种典型的查询方式,主子表关联,查询子表中的某些(或者全部)Key点对应的Value,横向显示(也即以行的方式显示) 这种查询方式很明显的一个却显示多次对字表查询(暂时抛开索引) 相比这种查询方式很多人都遇到过,如果子表是配置信息之类的小表的话,问题不大,如果字表数据量较大,可能就会有影响了. 这个查询目的是将”纵表”存储的结果“横向”显示,相当于横列转换的感觉了.可以将子表的结果一次性将纵表的结果转换成横标,再跟主表连接,然后得到一个最终一样的查询

PIVOT 行列转置函数的使用

数据如下图,有一个需求,统计scott.emp中不同部门(deptno)的薪资(sal)总数. 如果不考虑行列转换的话,那么最基本的方法是通过deptno进行分组: SELECT deptno, SUM(sal) FROM scott.emp GROUP BY deptno; 效果如下: 如果要在一行中显示所有部门的薪资总和,那么可以使用SUM(DECODE...)这种方式: SELECT SUM(DECODE(deptno, 10, sal)) AS dept_10, SUM(DECODE(d

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

PIVOT 行列相转

先介绍一下英文释义: pivot 英 ['p?v?t]  美 ['p?v?t] n. 枢轴:中心点:旋转运动 vt. 以-为中心旋转:把-置于枢轴上 vi. 在枢轴上转动:随-转移 adj. 枢轴的:关键的 从上面就不难看出这个函数是做什么的,旋转,转换,用于列和行之间对数据进行旋转或透视转换,同时执行聚合预算. 假设现在想查proudct数据表中返回每个员工每年处理过的订单的总价格.在输出中,每个员工占一行,每个订单年份占一列,每个员工行和订单年份列交叉位置上则是总价.以下我们用PIVOT查询

行列互转

定义: Pivot英文意思:回转运动 PIVOT用于将列值旋转为列名(即行转列), UNPIVOT用于将列名转为列值(即列转行), 也可以在SQL Server 2000可以用聚合函数配合CASE语句实现. 语法: PIVOT和UNPIVOT的语法区别在于是否有使用聚合函数 PIVOT: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT: table_source UNPIVO