转至繁体中文版     | 网站首页 | 文章中心 | 下载中心 | 图片中心 | 笑话频道 | 教程频道 | 会员中心 | 雁过留声 | 
最新公告:     "MinTao学以致用网"欢迎您的光临,你的支持便是我们的动力,欢迎广大网友和各界人士亲临指导,你们的一个小小的建议便是我们发展的开路石!  [MinTao  2007年9月5日]        
您现在的位置: MinTao学以致用网 >> 文章中心 >> 电子课堂 >> 数据库 >> Sql Server >> 文章正文
专题栏目
更多内容
最新推荐 更多内容
相关文章
sqlserver 2005 如何创建
通过OLEDB读取SQLSERVER
.Net下调用SqlServer2k存
仿递归算法,得到当前部
sqlserver 存储过程、存
[C#]log4net写SQLServer
SQLServer 工具箱(脚本
重建 SQLServer 索引的重
SQLServer 日志文件处理
返回服务器登陆的时间,
更多内容
动态SQL语句在SQLServer中非固定行的转列应用         
动态SQL语句在SQLServer中非固定行的转列应用
作者:jinjazz 文章来源:不详 点击数: 更新时间:2007-11-14 12:20:29

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

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


 

文章录入:mintao    责任编辑:mintao 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007 MinTao学以致用网(www.mintao.net) Inc All Rights Reserved.
    QQ:543098146有事请Q我! QQ:261561092有事请Q我 QQ:179647303有事请Q我 MSN:min906@126.com
    站长:MinTao 信息产业部ICP备案号:鄂ICP备07500065号

    学以致用是我们学习者的至高境界和不懈追求,[MinTao学以致用网]与大家共同学习,共同进步……
    信息产业部备案
    *鄂ICP备07500065号