当前位置: 代码迷 >> Sql Server >> 求解:sql查询语句行转列有关问题
  详细解决方案

求解:sql查询语句行转列有关问题

热度:14   发布时间:2016-04-24 09:54:18.0
求解:sql查询语句行转列问题
name     mobile
张三        1234
张三        2134
张三        3124
李四        2345
王五        3245
王五        4235
张六        4567


如何转成如下

name    mobile     mobile     mobile
张三       1234         2134       3124
李四        2345
王五        3245        4235
张六        4567
------解决思路----------------------
DECLARE @SQL NVARCHAR(MAX)
DECLARE @COUNT INT
SET @COUNT=(SELECT MAX(NUM)FROM(SELECT COUNT(1)NUM FROM 表 GROUP BY[name])A)
SET @SQL=';WITH CTE AS(SELECT *,ROW_NUMBER()OVER(PARTITION BY [name] ORDER BY mobile)RN FROM 表)SELECT[name]'
DECLARE @INDEX INT
SET @INDEX=1
WHILE @INDEX<=@COUNT
BEGIN
SET @SQL=@SQL+',ISNULL(MAX(CASE[RN]WHEN '+CAST(@INDEX AS VARCHAR(10))+' THEN[mobile]END),'''')[mobile]'
SET @INDEX=@INDEX+1
END
SET @SQL=@SQL+'FROM CTE GROUP BY [name]'
--PRINT @SQL
EXEC SYS.SP_EXECUTESQL @SQL

动态行转列,把 表 换成你的表名
------解决思路----------------------
引用:
Quote: 引用:


declare @sql varchar(max)='',@sql1 varchar(max)=''
 select @sql1=stuff((select ',['+convert(varchar(2),number)+']' from num 
 where number<=(select MAX(n) from 
 (select *,ROW_NUMBER()over(partition by name order by mobile) as n 
 from cte)as cte1)  for xml path('')),1,1,'') from num
  select @sql='select * from 
  (select *,ROW_NUMBER()over(partition by name order by mobile) as n from cte)as cte1 pivot 
 (max(mobile) for n in('+@sql1+')) as p'
exec( @sql)

num  是一个数据表。


谢谢,解决问题
  相关解决方案