SQL行转列

SQL行转列多个栏位转换的解决方案

【转自:群燕小站(http://www.zqunyan.com);原文链接: http://www.zqunyan.com/169.html

处理数据库报表时,难免会遇到行转列的问题,单个栏位的行转列比价容易实现,语法结构也比较简单

 

declare @课程列表 nvarchar(max),@sql nvarchar(max)
set @课程列表='[语文],[数学],[英语]'
set @sql='
select 姓名,课程,分数 from tb as s
pivot
(
	max(分数) for 课程 in (' + @课程列表 + ') 
) as p
'
exec sp_executesql @sql

 

首先是定义两个变量,一个存放行转列的列标题,一个存放执行用的sql语句

然后给两个变量赋值,在sql语句总使用pivot进行转换

微软对于pivot的解释(文字描述)

 

SELECT <非透视的列>,[第一个透视的列] AS <列名称>,[第二个透视的列] AS <列名称>, ...[最后一个透视的列] AS <列名称>
FROM (<生成数据的 SELECT 查询>) AS <源查询的别名>
PIVOT
( 
<聚合函数>(<要聚合的列>)
FOR
[<包含要成为列标题的值的列>]
IN ( [第一个透视的列], [第二个透视的列],... [最后一个透视的列])
) AS <透视表的别名>
<可选的 ORDER BY 子句>

看到上面有人的问题可能已经解决,因为需求不一样,特别是对于那个课程列表变量的赋值上。因为可能我们的列表并不固定,甚至说会动态变化呢?

下面就来说下解决办法,这也是为什么我会为列表定义一个变量的原因

 

max(分数) for 课程 in ([语文],[数学],[英语])

如果我们知道列表的具体内容,上面的写法最简单直接。如果我们不知道的时候,用变量动态的从数据库获取就变得更靠谱了

 

 

select @课程列表 =ISNULL(@课程列表, '') + '[' + column_课程 + '],' from tb group by column_课程
set @课程列表 = left(@课程列表, len(@课程列表)-1)

解释一下,上面一句select语句是从数据表中将可能的课程列表取出来用半角的逗号分隔拼接成变量@课程列表的值

 

第二句只是把变量最后一个逗号去掉

这样是不是就动态的取得了我们所需要的行转列的标题列表了

以上应该又可以解决一部分人需求了 

posted @ 2017-11-20 13:13  曲幽  阅读(460)  评论(0编辑  收藏  举报