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

2016-02-19 13:18 2 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

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

  

  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语句

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

  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    

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

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

  
   

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

延伸阅读
标签: SQLServer
如果注册的用户数达到一定程度,我们可以在数据库查询语句对其进行统计。 以下SQL语句能够统计出带某种类型后缀的email邮件注册量最大,及其排行顺序。 SELECT suffix_email, COUNT(suffix_email) AS email_count FROM (SELECT SUBSTRING(email, CHARINDEX('@', email), 100) AS suffix_email         FRO...
标签: SQLServer
  1.Dynamic SQL Format 1 EXECUTE IMMEDIATE SQLStatement     {USING TransactionObject} ; eg: string            Mysql Mysql = "CREATE TABLE Employee "&     +"(emp_id integer not null,"&...
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...
说明:复制表(只复制结构,源表名: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...

经验教程

22

收藏

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