动态SQL语句在SQLServer中非固定行的转列应用

泽西80

泽西80

2016-02-19 13:18

今天图老师小编要跟大家分享动态SQL语句在SQLServer中非固定行的转列应用,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

  社区里有人提问一个行转列的应用,在SQLServer中都是用Case的,我随便答了一下,由于是非固定行,有网友给我发消息问怎么实现,详细来说一下。
  
  相关联接
  http://community.csdn.net/Expert/topic/3417/3417326.xml?temp=.8530084
  
  Answer:
  表
  F1      F2
  jack    book1
  jack    book2
  jack    book3
  mary    book4
  mary    book5
  ...
  
  转化为
  F1  F2  F3  F4  F5
  jack       book1     book2     book3
  mary      book4     book5
  billy       book6     book7
  
  --------------------------------------------
  
  测试过程:
  --------------------------------------------
  
  
  create table Test
  (F1 char(10),
   F2 char(10))

  --测试表

  insert into Test
  select 'jack' F1,'book1' F2
  union
  select 'jack' F1,'book2' F2
  union
  select 'jack' F1,'book3' F2
  union
  select 'Mary' F1,'book4' F2
  union
  select 'Mary' F1,'book5' F2
  union
  select 'Mike' F1,'book1' F2
  union
  select 'Mike' F1,'book5' F2
  union
  select 'Mike' F1,'book7' F2
  union
  select 'Mike' F1,'book9' F2

  --插入数据

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  select id=identity(int,0,1),f1,f2 into #t from test

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  
  
  select a.f1,a.f2,a.id,cc ,N=
   case when (idcc) then cast(id-cc-minn+1 as Char(10))
        when (id=cc) then cast(id+1 as Char(10))
   end
  into #Temp
  from #t a,
  (select f1,cc,minn  from
    (select  f1,count(*)as cc,min(id)-count(*) as minn from #t group by f1) t)b
  where a.f1=b.f1

  
  --构造两个临时表,由于要用到行号,所以必须要第一个临时表,第二个可以不用

  

  select * from #Temp

  --这个表笔原来的多一个字段,每个人的第n条记录

  DECLARE @SQL VARCHAR(8000)
  SET @SQL='SELECT f1  姓名'
  SELECT @SQL= @SQL+ ',MIN(CASE WHEN N = ''' + N + ''' THEN F2 END) [F' + N + ']' FROM (SELECT DISTINCT N FROM #Temp) A
  SET @SQL=@SQL+' FROM #Temp GROUP BY F1'
  EXEC (@SQL)
   
  --一条动态SQL语句

  drop table #t
  drop table #Temp
  drop table Test

  
  /*
  jack       book1      1        
  jack       book2      2        
  jack       book3      3        
  Mary       book4      1        
  Mary       book5      2        
  Mike       book1      1        
  Mike       book5      2        
  Mike       book7      3        
  Mike       book9      4        
  --------Temp表数据*/

  /*
  jack       book1      book2      book3      NULL
  Mary       book4      book5      NULL NULL
  Mike       book1      book5      book7      book9    

  --------最终结果*/

  
   

展开更多 50%)
分享

猜你喜欢

动态SQL语句在SQLServer中非固定行的转列应用

编程语言 网络编程
动态SQL语句在SQLServer中非固定行的转列应用

table 行转列的sql详解

编程语言 网络编程
table 行转列的sql详解

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

动态SQL语句

SQLServer
动态SQL语句

Sql Server 2000 行转列的实现(横排)

编程语言 网络编程
Sql Server 2000 行转列的实现(横排)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

sqlserver FOR XML PATH 语句的应用

编程语言 网络编程
sqlserver FOR XML PATH 语句的应用

sql server行转列问题终极解决

SQLServer
sql server行转列问题终极解决

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

win10系统中多余的字体怎么删除掉

win10系统中多余的字体怎么删除掉

全屏幕编辑软件的编写(C语言)06

全屏幕编辑软件的编写(C语言)06
下拉加载更多内容 ↓