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张三李四陈五王六
*/