关于pivot函数,行转列的问题

一只蛤蟆一张嘴 2016-05-29 04:50:00

对于上面的这个表,我希望进行行转列,然后我用了语句:
SELECT * FROM [PhaseWork]
pivot(
work
for
name
IN (现有,演示,阶段1,阶段2,阶段3)
) as a


但执行失败了,谁能拯救我
...全文
237 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 10 楼 roy_88 的回复:
对,有ID会影响转行列显示记录数,会存在null 值列
学习了,大神真是大神,神速回答,以后赖上你了
  • 打赏
  • 举报
回复
引用 5 楼 wmxcn2000 的回复:
1、2、3 楼,这都什么速度 。
你这也很速度,你的回答很好,让我理解了id的唯一性的存在会影响分组,学习了
中国风 2016-05-30
  • 打赏
  • 举报
回复
对,有ID会影响转行列显示记录数,会存在null 值列
  • 打赏
  • 举报
回复
引用 3 楼 Ekun_sky 的回复:
with PhaseWork(id,name,work,prjid) as
(
select 1,'现有',51.44,1 union all 
select 2,'演示',5.035,1 union all 
select 3,'阶段1',5.375,1 union all 
select 4,'阶段2',0,1 union all 
select 5,'阶段3',0,1
)
select * from PhaseWork pivot( max(work) for name in ([现有],[演示],[阶段1],[阶段2],[阶段3])) as b

/*
1	1	51.440	NULL	NULL	NULL	NULL
2	1	NULL	5.035	NULL	NULL	NULL
3	1	NULL	NULL	5.375	NULL	NULL
4	1	NULL	NULL	NULL	0.000	NULL
5	1	NULL	NULL	NULL	NULL	0.000
*/
上面这个 with PhaseWork(id,name,work,prjid) as ( select 1,'现有',51.44,1 union all select 2,'演示',5.035,1 union all select 3,'阶段1',5.375,1 union all select 4,'阶段2',0,1 union all select 5,'阶段3',0,1 ) 查询的作用是什么,因为我试了一下,发现这语句执行与否,结果都是一样的
  • 打赏
  • 举报
回复
引用 2 楼 roy_88 的回复:
先去掉ID生成结果集 别名表a 再行转列时MAX(work)--用聚合函数 MAX/MIN/SUM/COUNT--去处理,根据自己的情况去做
这个ID去掉与否,只是影响是否分组是吗?我昨天用以下语句 SELECT * FROM [PhaseWork] pivot( max( work) for name IN (现有,演示,阶段1,阶段2,阶段3) ) as a一直报错,今天发现竟然出结果了,只是没分组,出来5行结果;然后我用没有ID的相同数据表用相同的查询语句,自带分组,只出一行结果。
0与1之间 2016-05-29
  • 打赏
  • 举报
回复
PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P
卖水果的net 2016-05-29
  • 打赏
  • 举报
回复
1、2、3 楼,这都什么速度 。
卖水果的net 2016-05-29
  • 打赏
  • 举报
回复

-- 看看你要哪个结果
print '--分组的'
SELECT prjid,现有,演示,阶段1,阶段2,阶段3 
from
(select prjid,name, work FROM test ) p
  pivot(
  max(work)
  for  
  name 
  IN (现有,演示,阶段1,阶段2,阶段3)
  ) as a
go
print '--不分组的'
SELECT prjid,现有,演示,阶段1,阶段2,阶段3 
from test
  pivot(
  max(work)
  for  
  name 
  IN (现有,演示,阶段1,阶段2,阶段3)
  ) as a
go

Ekun_sky 2016-05-29
  • 打赏
  • 举报
回复
with PhaseWork(id,name,work,prjid) as
(
select 1,'现有',51.44,1 union all 
select 2,'演示',5.035,1 union all 
select 3,'阶段1',5.375,1 union all 
select 4,'阶段2',0,1 union all 
select 5,'阶段3',0,1
)



select * from PhaseWork pivot( max(work) for name in ([现有],[演示],[阶段1],[阶段2],[阶段3])) as b

/*
1	1	51.440	NULL	NULL	NULL	NULL
2	1	NULL	5.035	NULL	NULL	NULL
3	1	NULL	NULL	5.375	NULL	NULL
4	1	NULL	NULL	NULL	0.000	NULL
5	1	NULL	NULL	NULL	NULL	0.000
*/
中国风 2016-05-29
  • 打赏
  • 举报
回复
先去掉ID生成结果集 别名表a 再行转列时MAX(work)--用聚合函数 MAX/MIN/SUM/COUNT--去处理,根据自己的情况去做
中国风 2016-05-29
  • 打赏
  • 举报
回复
use Tempdb
go
--> --> 
 
declare @PhaseWork table([ID] int,[name] nvarchar(23), [work] DECIMAL(18,9), prjid int)
Insert @PhaseWork
select 1,N'现有',51.44,1 union all
select 2,N'演示',5.035,1 union all
select 3,N'阶段1',5.375,1 union all
select 4,N'阶段2',0,1 union all
select 5,N'阶段3',0,1
 
SELECT * FROM (SELECT [name],[work],[prjid] from @PhaseWork ) AS a
  pivot(
  MAX(work)
  for  
  [name] 
  IN (现有,演示,阶段1,阶段2,阶段3)
  ) as b

  /*
  prjid	现有	演示	阶段1	阶段2	阶段3
1	51.440000000	5.035000000	5.375000000	0.000000000	0.000000000
*/

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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