锁定老帖子 主题:如何实现MSSQL数据表行列转换
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-17
在做报表应用时,总是要涉及行行色色的数据操作,如题,就是一个很好的例子: 一、为了实现数据表行列转换,首先我们来创建一个数据表 CREATE TABLE MYTABLE ( myId int identity(1,1) constraint pk_myId primary key, bookName varchar(50) not null, bookAuthor varchar(20) not null, bookPubDate datetime default getdate(), bookSaleB int , ) GO INSERT INTO MYTABLE SELECT 'Spring入门','小孟',getDate(),54,52,48 GO SELECT * FROM MYTABLE GO 显示的表数据为: bookName bookAuthor bookPubDate bookSaleA bookSaleB bookSaleC 二、自问:如果要把bookAuthor的列数据转换为行时,应该如何实现呢? SET @SQL = 'SELECT ' --SET 用于单行记录 SELECT @SQL = @SQL + ' CASE bookAuthor when '''+bookAuthor+''' THEN 1 END ['+bookAuthor+'] ,' FROM (SELECT DISTINCT bookAuthor FROM MYTABLE) AS TEMPTABLE --SELECT用于单行或者多行记录 SELECT @SQL = LEFT(@SQL,LEN(@SQL)-1) + 'INTO ##MYTABLETEMP FROM MYTABLE' EXEC(@SQL) SELECT * FROM ##MYTABLEtEMP DROP TABLE ##MYTABLETEMP GO 查询结果: 刘自明 孟进 小刘 小孟 NULL NULL NULL 1 这样我们就实现了列到行的转换。 三、自问,既然能做到列到行的转换,那反之又如何呢? 我们将用列bookSaleA、bookSaleB、bookSaleC的数据转换为bookSaleAll列 DECLARE @SQL VARCHAR(8000) --为何要定义这么大呢?当你的列记录多的时候你就知道 SET @SQL = '' --记得哦 SELECT @SQL = 'SELECT '''+name+''' AS bookSaleAll FROM MYTABLE UNION ALL ' FROM syscolumns WHERE ColID LIKE 'bookSale%' ORDER BY ColID SELECT @SQL = LEFT(@SQL,LEN(@SQL)-8) EXEC(@SQL) GO 注: 如果在列转为行时要把多行的数据压为一行,则需要使用max函数,如: DECLARE @SQL VARCHAR(8000) --为何要定义这么大呢?当你的列记录多的时候你就知道 SET @SQL = 'SELECT distinct ' --SET 用于单行记录 SELECT @SQL = @SQL + 'max(CASE imgAppPageId when '''+imgAppPageId+''' THEN imgAppPageId else '''' END) ['+imgAppPageId+'] ,' print(@SQL) SELECT @SQL = LEFT(@SQL,LEN(@SQL)-1) + 'INTO ##MYTABLETEMP FROM PageImageTable ' print(@SQL) EXEC(@SQL) print(@SQL) SELECT * FROM ##MYTABLEtEMP DROP TABLE ##MYTABLETEMP 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 3560 次