当前位置: 代码迷 >> Sql Server >> [行转列] 一张表,该如何处理
  详细解决方案

[行转列] 一张表,该如何处理

热度:98   发布时间:2016-04-24 10:53:17.0
[行转列] 一张表

用户表 用户数不固定
ID                  Name
1                   lily
2             lucy
3                   jim
...
有多少个用户就有多少列,如下

列名     用户1      用户2       用户3
ID          1                2              3
Name    lily           lucy          jim

------解决方案--------------------
就是拼接sql,拼接成行列转换的语句。

--> 测试数据: [ta]
if object_id('[ta]') is not null 
drop table [ta]
create table [ta] ([ID] int,[Name] varchar(4))
insert into [ta]
select 1,'lily' union all
select 2,'lucy' union all
select 3,'jim'

declare @s varchar(8000)
set @s='select 列名=''ID'''
select @s=@s+',max(case when id='+cast(ID as varchar(5))+' then cast(id as varchar(10)) else null end)'
from ta
set @s=@s+'from ta union '

set @s=@s+'select 列名=''Name'''
select @s=@s+',max(case when id='+cast(ID as varchar(5))+' then name else null end)'
from ta

set @s=@s+'from ta '

exec(@s)

ID 1 2 3
Name lily lucy jim

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

看不太懂啊,大哥,我这用户都是唯一的

你的意思可以理解为有多少个用户表中就有多少行数据吗?

额,表中用户都是唯一的,只是要把它列着来放,  又多了一个用户 就是下面这样了

用户表 用户数不固定
ID                  Name
1                   lily
2                lucy
3                   jim
4                  himi
...
有多少个用户就有多少列,如下
 
列名     用户1      用户2       用户3        用户4
ID          1                2              3                4
Name    lily           lucy          jim              himi

六楼方法
------解决方案--------------------
--基础表数据
CREATE TABLE #TEMP (ID VARCHAR(10),NAME VARCHAR(10))
INSERT INTO #TEMP
SELECT '1','张三'
UNION ALL
SELECT '2','李四'
UNION ALL
SELECT '3','王五'
UNION ALL
SELECT '4','李六'

DECLARE @SQL VARCHAR(MAX)

SET @SQL='SELECT ''ID'' 列名'
SELECT  @SQL=@SQL+',MAX(CASE WHEN ID='''+ID+'''  then  ID  else null end) as [用户'+ID+'] ' 
from (
SELECT  DISTINCT  ID,NAME  FROM #TEMP 
) AS T 
SET @SQL=@SQL+' FROM #TEMP  '

SET @SQL=@SQL+' UNION ALL '

SET @SQL=@SQL+ ' SELECT ''姓名'' 列名'
SELECT  @SQL=@SQL+',MAX(CASE WHEN NAME='''+NAME+'''  then  NAME  else null end) as [用户'+ID+'] ' 
from (
SELECT  DISTINCT  ID,NAME  FROM #TEMP 
) AS T 
SET @SQL=@SQL+' FROM #TEMP '

PRINT(@SQL)
EXEC(@SQL)

DROP TABLE  #TEMP
  相关解决方案