求教数据另类行列转换

Wilson伟庭 2012-07-06 01:11:58
求静态的select 语句怎么做?能不能做?或者有什么好的方案修改输出的格式?

数据:
姓名 技能
张三 C#
张三 Java
张三 C++
李四 PHP
李四 C
王五 C#


输出:
姓名 技能1 技能2 技能3.......
张三 C# Java C++
李四 PHP C
王五 C#
...全文
123 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

不错,基本都解决了我的问题了。只是技能数是不确定的。
所以说静态是不可能根据技能数动态定义表头的吗?
[/Quote]

动态的那个写法已经做到了。你可以多加几个技能试试
Wilson伟庭 2012-07-06
  • 打赏
  • 举报
回复
不错,基本都解决了我的问题了。只是技能数是不确定的。
所以说静态是不可能根据技能数动态定义表头的吗?
  • 打赏
  • 举报
回复

--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
create table [test]([姓名] varchar(4),[技能] varchar(4))
insert [test]
select '张三','C#' union all
select '张三','Java' union all
select '张三','C++' union all
select '李四','PHP' union all
select '李四','C' union all
select '王五','C#'



select
ROW_NUMBER()over(partition by 姓名 order by getdate()) as px,
* INTO #test
from
test
declare @str varchar(2000)
set @str=''
select @str=@str+',[技能'+LTRIM(px)+']=max(case when px='+LTRIM(px)
+' then [技能] else '''' end)'
from #test
group by px
exec('select [姓名]'+@str+' from #test group by [姓名]')
/*
姓名 技能1 技能2 技能3
李四 PHP C
王五 C#
张三 C# Java C++
*/
--小F-- 2012-07-06
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2012-07-06 13:20:41
-- Version:
-- Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86)
-- Apr 22 2011 11:57:00
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([姓名] varchar(4),[技能] varchar(4))
insert [tb]
select '张三','C#' union all
select '张三','Java' union all
select '张三','C++' union all
select '李四','PHP' union all
select '李四','C' union all
select '王五','C#'
--------------开始查询--------------------------
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case px when ''' + ltrim(px) + ''' then 技能 else '''' end) [技能' + ltrim(px) + ']'
from (select distinct px from (select px=row_number()over(partition by 姓名 order by getdate()),* from tb)t
) as a
set @sql = @sql + ' from (select px=row_number()over(partition by 姓名 order by getdate()),* from tb)t
group by 姓名'
exec(@sql)
----------------结果----------------------------
/* 姓名 技能1 技能2 技能3
---- ---- ---- ----
李四 PHP C
王五 C#
张三 C# Java C++

(3 行受影响)

*/
wanshichen 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

SQL code
select
姓名,
max(case px when 1 then 技能 else '' end) as 技能1,
max(case px when 2 then 技能 else '' end) as 技能2,
max(case px when 3 then 技能 else '' end) as 技能3
from
(select px=row……
[/Quote]
基本就是这样,不过如果最大技能数不确定的话,恐怕还是不行。
--小F-- 2012-07-06
  • 打赏
  • 举报
回复
select 
姓名,
max(case px when 1 then 技能 else '' end) as 技能1,
max(case px when 2 then 技能 else '' end) as 技能2,
max(case px when 3 then 技能 else '' end) as 技能3
from
(select px=row_number()over(partition by 姓名 order by getdate()),* from tb)t
group by
姓名

34,588

社区成员

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

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