行列转换小结 Pivot ,Unpivot (转,改)
行专列 Pivot
1)SQL 2000版本
静态
SELECT ID ,
SUM(CASE Code
WHEN 'Item1' THEN Value
ELSE 0
END) AS Item1 ,
SUM(CASE Code
WHEN 'Item2' THEN Value
ELSE 0
END) AS Item2 ,
SUM(CASE Code
WHEN 'Item3' THEN Value
ELSE 0
END) AS Item3
FROM RowToCol
GROUP BY ID
--或者用max也行
SELECT ID ,
MAX(CASE Code
WHEN 'Item1' THEN Value
ELSE 0
END) AS Item1 ,
MAX(CASE Code
WHEN 'Item2' THEN Value
ELSE 0
END) AS Item2 ,
MAX(CASE Code
WHEN 'Item3' THEN Value
ELSE 0
END) AS Item3
FROM RowToCol
GROUP BY ID
动态
在不确定有多少行需要转为列时,先distinct出待转列的值,再拼出包含若干个CASE的SQL语句,然后运行。
DECLARE @sql VARCHAR(8000)
SET @sql = 'select ID '
SELECT @sql = @sql + ' , max(case Code when ''' + Code
+ ''' then Value else 0 end) [' + Code + ']'
FROM ( SELECT DISTINCT
Code
FROM RowToCol
) AS a
SET @sql = @sql + ' from RowToCol group by ID'
--print @sql
EXEC(@sql)
2) SQL 2005以后版本
PIVOT是SQL Server 2005的新语法,Oracle在11g中也推出了这个语法。
静态
SELECT custid ,
[] ,
[] ,
[]
FROM Sales.Orders PIVOT( SUM(freight) FOR shipperid IN ( [], [], [] ) ) AS P;
分解

结果

动态
用PIVOT拼写动态SQL时就简单了,只要把后面的列清单整理出来就可以了。
DECLARE @sql VARCHAR(8000)
SELECT @sql = ISNULL(@sql + '],[', '') + Code
FROM RowToCol
GROUP BY Code
SET @sql = '[' + @sql + ']'
--print @sql
EXEC ('select * from (select * from RowToCol) a pivot (max(value) for Code in (' + @sql + ')) b')
列转行 UNPIVOT
1)SQL Server 2000版
静态
SELECT ID ,
Code = 'Item1' ,
Value = Item1
FROM ColToRow
UNION ALL
SELECT ID ,
Code = 'Item2' ,
Value = Item2
FROM ColToRow
UNION ALL
SELECT ID ,
Code = 'Item3' ,
Value = Item3
FROM ColToRow
ORDER BY ID
SQL Server对于多个UNION的排序,只要在最后加ORDER BY就可以了。
动态
在不确定有多少列需要转为行时,先借助系统表syscolumns找出待转行的列,再拼出包含若干个UNION语句,然后运行。
DECLARE @sql VARCHAR(8000)
SELECT @sql = ISNULL(@sql + ' union all ', '') + ' select ID , [Code] = '
+ QUOTENAME(name, '''') + ' , [Value] = ' + QUOTENAME(name)
+ ' from ColToRow'
FROM syscolumns
WHERE name <> N'ID'
AND id = OBJECT_ID('ColToRow')
ORDER BY colid ASC
--print @sql
EXEC(@sql + ' order by ID ')
2) SQL 2005以后版本
静态
创建样本
-- sample data for UNPIVOT example
USE TSQL2012;
IF OBJECT_ID(N'Sales.FreightTotals', N'U') IS NOT NULL DROP TABLE Sales.FreightTotals;
GO WITH PivotData AS
(
SELECT
custid , -- grouping column
shipperid, -- spreading column
freight -- aggregation column
FROM Sales.Orders
)
SELECT *
INTO Sales.FreightTotals
FROM PivotData
PIVOT( SUM(freight) FOR shipperid IN ([],[],[]) ) AS P;
UNPIVOT
SELECT *
FROM Sales.FreightTotals;
-- unpivot data
SELECT custid ,
shipperid ,
freight
FROM Sales.FreightTotals UNPIVOT( freight FOR shipperid IN ( [], [], [] ) ) AS U;

动态
DECLARE @sql VARCHAR(8000)
SELECT @sql = ISNULL(@sql + '],[', '') + name
FROM syscolumns
WHERE name <> N'ID'
AND id = OBJECT_ID('ColToRow')
SET @sql = '[' + @sql + ']'
--print @sql
EXEC('select ID , Code , Value from ColToRow unpivot (Value for Code in(' + @sql + ')) t')
参考文档
行列转换小结 Pivot ,Unpivot (转,改)的更多相关文章
- SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子
使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...
- Oracle11g 行列转换函数PIVOT and UNPIVOT
作为Oracle开发工程师,推荐大伙看看 PIVOT and UNPIVOT Operators in Oracle Database 11g Release 1 This article shows ...
- SQL SERVER 中的行列转换小结
1. 介绍说明 前段时间组内的小伙伴在升级维护项目中,经常涉及一些复杂的数据转换问题,让我去看下有些地方怎么处理,我发现好多都是涉及到行列转换的问题,处理起来经常会比较麻烦,借此也总结一下,方便以后的 ...
- Oracle 行列转换函数pivot、unpivot的使用(二)
一.行转列pivot 关键函数pivot,其用法如下 pivot(聚合函数 for 列名 in(类型)) select * from table_name pivot(max(column_name) ...
- Oracle行列转换小结
目录结构如下:行转列列转行[一].行转列 1.1.初始测试数据 表结构:TEST_TB_GRADE Sql代码 create table TEST_TB_GRADE ( ID NUM ...
- SQL SERVER 合并重复行,行列转换
引用自:http://www.cnblogs.com/love-summer/archive/2012/03/27/2419778.html sql server2000 里面如何实现oracle10 ...
- SQL行列转换6种方法
在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解 ...
- SQL Server中行列转换 Pivot UnPivot
SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
- 【转】Spark实现行列转换pivot和unpivot
背景 做过数据清洗ETL工作的都知道,行列转换是一个常见的数据整理需求.在不同的编程语言中有不同的实现方法,比如SQL中使用case+group,或者Power BI的M语言中用拖放组件实现.今天正好 ...
随机推荐
- 【转】杭电ACM试题分类
注:网上搜的 第一篇 1001 这个就不用说了吧1002 简单的大数1003 DP经典问题,最大连续子段和1004 简单题1005 找规律(循环点)1006 感觉有点BT的题,我到现在还没过1007 ...
- idea修改文件名后出现main method should be static错误
1.确保你有main方法 2.别忘了main方法里还有参数: String[] args
- 依赖注入(DI)和控制反转(IOC)
依赖注入(DI)和控制反转(IOC) 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只 ...
- MySQL show binglog event in 'log_name'
二进制日志文件记录的内容:记录表的更改. 二进制日志文件记录的形式:基于语句的复制.基于行的复制. 两种记录形式的优点与不足: 基于语句的复制-->它不能保证复制的正确性.如随机函数可能在两台机 ...
- 7篇Model View和4篇双缓冲
http://www.cnblogs.com/SkylineSoft/category/299475.html
- HttpWebRequest使用注意(发生阻塞的解决办法)
原文 http://www.cnblogs.com/Fooo/archive/2008/10/31/1323400.html HttpWebRequest使用注意(发生阻塞的解决办法) , count ...
- 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案
2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...
- 某IT校招笔试
前言 博主明天上午9点还有面试,今天突然看到某大牌IT公司笔试题目,必须做一下了 题目 1.假设把整数关键码K散列到N个槽列表,以下哪些散列函数是好的散列函数 A: h(K)=K/N; B: h(K) ...
- 日常之学习CSS3变形和js函数指针
1,transform变形属性,包括rotate(xxdeg)旋转,translate(x轴px,y轴px)移动,scale(0.5,2)变形(x轴缩小0.5倍,y轴放大2倍),skew(x轴deg, ...
- js 去除字符串左右两端的空格
<script type="text/javascript"> function trim(str){ //删除左右两端的空格 return str.repl ...