sql server “动态pivot行转列”理解
来源:互联网 发布:数据库2000支持w7吗 编辑:程序博客网 时间:2024/06/08 04:22
1.什么是行转列?
最近工作中要用到动态行转列的知识,下面描述一下情景,何为“行转列”:
在表score中,有有关学生的一些信息,这些信息包括学生姓名,学科名称和分数
表score
name subject score
张三 语文 78
李四 数学 83
王五 数学 59
张三 数学 99
李四 英语 90
李四 语文 77
王五 英语 86
现在我们需要对表score进行处理,得出如下的形式的表:
name“语文”“数学”“英语”
张三 78 59 0
李四 77 83 90
王五 0 59 86
原本“语文”“数学”“英语”这些字段是出现在行中的,既是行的一些记录中的,现在经过变换过程,成了表的列属性,这种过程就称作“行转列”。sql server的存储过程支持行转列,即PIVOT,那么对应的列转行就叫做UNPIVOT.
2.行转列(PIVOT)实现方式
我想先把上面的过程写出来,然后再分析语法的关键处。
1).最简单的方法:静态拼接行转列
select name,
sum(case [subject] when ‘语文’ then [score] else 0 end) as ‘语文’ ,
sum(case [subject] when ‘数学’ then [score] else 0 end) as ‘数学’ ,
sum(case [subject] when ‘英语’ then [score] else 0 end) as ‘英语’
from [dbo].[score]
2).静态PIVOT行转列
select *
from ( select [name],[subject],[score] from [dbo].[score]) p pivot
(sum([score) for [subject] in ([语文],[数学],[英语])) as pvt order by pvt.[name]
3).动态PIVOT行转列:
DECLARE @sql_str NVARCHAR(MAX)
DECLARE @sql_col NVARCHAR(MAX)
DECLARE @tableName SYSNAME --行转列表
DECLARE @groupColumn SYSNAME --分组字段
DECLARE @row2column SYSNAME --行变列的字段
DECLARE @row2columnValue SYSNAME --行变列值的字段
SET @tableName = 'TestRows2Columns'
SET @groupColumn = 'UserName'
SET @row2column = 'Subject'
SET @row2columnValue = 'Source'
--从行数据中获取可能存在的列
SET @sql_str = N'
SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])
FROM ['+@tableName+'] GROUP BY ['+@row2column+']'
--PRINT @sql_str
EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT
--PRINT @sql_col
SET @sql_str = N'
SELECT * FROM (
SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']) p PIVOT
(SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt
ORDER BY pvt.['+@groupColumn+']'
--PRINT (@sql_str)
EXEC (@sql_str)
这个理解起来有点难度,也是参照一个大大写的才慢慢看明白的,附上他的博客连接:http://www.cnblogs.com/gaizai/p/3753296.html
3.行转列(PIVOT)语法
pivot的语法分三步走:
1).先把要pivot的原始资料查询(Query)好,像上面的那个例子,表score就是第一个步骤查询好的资料;
2).设定好pivot的栏位与方式,上例中,sum([score) for [subject] in ([语文],[数学],[英语])就是第二步骤;
3).依照pivot好了的资料,呈现结果。也就是主句select 这种形式的。
- sql server “动态pivot行转列”理解
- sql server:sql动态行转列(pivot) 例子
- 【转】SQL Server 动态行转列(PIVOT)
- &ldquo和&rdquo编码
- 类型“GridView”的控件“***”必须放在具有 runat=server 的窗体标记内。
- sql server行转列 Pivot UnPivot
- sql server 行转列 Pivot UnPivot
- [分享] “+”和“&”的区别
- 行转列:SQL SERVER PIVOT与用法解释
- 行转列:SQL SERVER PIVOT与用法解释
- 行转列:SQL SERVER PIVOT与用法解释
- SQL server使用pivot函数实现行转列
- SQL SERVER PIVOT使用
- [面试笔记のT-SQL] 与关键字“like”配合使用的通配符
- 网上流传“魔方文化启示录”
- “七-七”卢沟桥事变爆发
- “=”号惹得祸
- 使用“. ”来执行shell
- POJ 2075 Tangled in Cables (kruskal算法 MST + map)
- day10-jsp&ELの代码学习(jsp)
- FF、chrome、IE对放在一个块作用域中函数声明的处理差异
- 黑马程序员——Java之面向对象(一)
- CSDN Markdown简明教程5-快速上手
- sql server “动态pivot行转列”理解
- 快速修改win7等系统的hosts文件
- 进程间线程间的同步锁原理和种类
- hdu4027 Can you answer these queries?
- swift基本语法04 字典
- Ubantu Gerrit 安装详解
- POJ 1861 Network (Kruskal求MST模板题)
- 【设计模式】单例设计模式的N中Java实现方法
- 【测试工具】Linux下查看指定进程的内存总和