SQL如何行转列,不需聚合函数

chair128 2013-09-02 01:11:15
现有如下表:
单号 审核人 流程节点
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

...全文
676 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shawn 2013-09-02
  • 打赏
  • 举报
回复 1
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	张三	李四	陈五	王六
*/
--小F-- 2013-09-02
  • 打赏
  • 举报
回复
用ROW_NUMBER()OVER先生成一个排列 然后再用MAX(CASE ..WHEN..)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧