用户表 用户数不固定
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
------解决方案--------------------
六楼方法
------解决方案--------------------
--基础表数据
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