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

2016-02-19 13:18 4 1 收藏

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

【 tulaoshi.com - 编程语言 】

  社区里有人提问一个行转列的应用,在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

  --插入数据

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

  
  
  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

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

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

  

  select * from #Temp

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

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

  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    

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

  
   

来源:http://www.tulaoshi.com/n/20160219/1603738.html

延伸阅读
标签: ASP
五花八门的SQL产品多得要命,或许你早顾不得其它甩开袖子就动手干了。但你要同时采用ASP和SQL的话就可能会头晕。MySQL、SQL Server和mSQL都是绝佳的SQL工具,可惜,在ASP的环境下你却用不着它们来创建实用的SQL语句。不过,你可以利用自己掌握的Access知识以及相应的Access技能,再加上我们的提示和技巧,相信一定能成功地在你的ASP网页中加入SQ...
标签: ASP
我们到目前为止所谈到的SQL语句相对较为简单,如果再能通过标准的recordset循环查询,那么这些语句也能满足一些更复杂的要求。不过,何必非要拘泥在浅尝则止的基础水准之上呢?你完全可以再增加其他一些符号,比如AND、 OR和NOT来完成更强大的功能。 以下面的SQL语句为例: SQL ="SELECT c_firstname, c_lastname, c_email FROM customers WH...
说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 11 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) insert into b(a, b, c) select d,e,f from b; 说明:显示文章、提交人和最后回复时间 select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title...
SQL的意思是结构化查询语言,其主要功能是同各种数据库建立联系,进行沟通.查询指的是对存储于SQL的数据的请求。查询要完成的任务是:将 Select 语句的结果集提供给用户。Select 语句从 SQL 中检索出数据,然后以一个或多个结果集的形式将其返回给用户。  ======================================================...
新建表: create table [表名] ( [自动编号字段] int IDENTITY (1,1) PRIMARY KEY , [字段1] nVarChar(50) default '默认值' null , [字段2] ntext null , [字段3] datetime, [字段4] money null , [字段5] int defaul...

经验教程

522

收藏

8
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部