首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL怎么行转列,不需聚合函数

2013-09-05 
SQL如何行转列,不需聚合函数现有如下表:单号审核人流程节点A001张三2001A001李四2002A001陈五2003A001王六

SQL如何行转列,不需聚合函数
现有如下表:
单号    审核人    流程节点
A001    张三      2001
A001    李四      2002
A001    陈五      2003
A001    王六      2004
A002    张三      2001
A002    李四      2002
A002    陈五      2003
A002    王六      2004
……

我想要得到的结果表:
单号    一审(2001)    二审(2002)    三审(2003)    四审(2004)
A001    张三          李四          陈五          王六
……

在网上查了好久,都是用Pivot需聚合函数的,但上表根本不需聚合,没找到方法,请大家指点,谢谢!
数据库为: MS SQL Server 2012

SQL 行转列 不要聚合
[解决办法]

if OBJECT_ID('tempdb..#temp', 'u') is not null   drop table #temp;
go
create table #temp( [单号] varchar(100), [审核人] varchar(100), [流程节点] int);
insert #temp
select 'A001','张三','2001' union all
select 'A001','李四','2002' union all
select 'A001','陈五','2003' union all
select 'A001','王六','2004' union all
select 'A002','张三','2001' union all
select 'A002','李四','2002' union all
select 'A002','陈五','2003' union all
select 'A002','王六','2004' 

--为什么不能用聚合呢?
--方法1.CASE WHEN:
SELECT
[单号],
[一审(2001)] = MAX(CASE [流程节点] WHEN 2001 THEN [审核人] END),
[二审(2002)] = MAX(CASE [流程节点] WHEN 2002 THEN [审核人] END),
[三审(2003)] = MAX(CASE [流程节点] WHEN 2003 THEN [审核人] END),
[四审(2004)] = MAX(CASE [流程节点] WHEN 2004 THEN [审核人] END)


from #temp
GROUP BY [单号]

--方法2.PIVOT:它实际上也会被转化成case when语句
SELECT
[单号],
[一审(2001)] = [2001],
[二审(2002)] = [2002],
[三审(2003)] = [2003],
[四审(2004)] = [2004]
from #temp A
PIVOT
(MAX([审核人]) FOR [流程节点] IN([2001],[2002],[2003],[2004])) B

/*
单号一审(2001)二审(2002)三审(2003)四审(2004)
A001张三李四陈五王六
A002张三李四陈五王六
*/

热点排行