行专列 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')

参考文档

03. 行列转换写法小结

行列转换小结 Pivot ,Unpivot (转,改)的更多相关文章

  1. SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子

    使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...

  2. Oracle11g 行列转换函数PIVOT and UNPIVOT

    作为Oracle开发工程师,推荐大伙看看 PIVOT and UNPIVOT Operators in Oracle Database 11g Release 1 This article shows ...

  3. SQL SERVER 中的行列转换小结

    1. 介绍说明 前段时间组内的小伙伴在升级维护项目中,经常涉及一些复杂的数据转换问题,让我去看下有些地方怎么处理,我发现好多都是涉及到行列转换的问题,处理起来经常会比较麻烦,借此也总结一下,方便以后的 ...

  4. Oracle 行列转换函数pivot、unpivot的使用(二)

    一.行转列pivot 关键函数pivot,其用法如下 pivot(聚合函数 for 列名 in(类型)) select * from table_name pivot(max(column_name) ...

  5. Oracle行列转换小结

    目录结构如下:行转列列转行[一].行转列 1.1.初始测试数据 表结构:TEST_TB_GRADE Sql代码 create table TEST_TB_GRADE (   ID        NUM ...

  6. SQL SERVER 合并重复行,行列转换

    引用自:http://www.cnblogs.com/love-summer/archive/2012/03/27/2419778.html sql server2000 里面如何实现oracle10 ...

  7. SQL行列转换6种方法

    在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解 ...

  8. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  9. 【转】Spark实现行列转换pivot和unpivot

    背景 做过数据清洗ETL工作的都知道,行列转换是一个常见的数据整理需求.在不同的编程语言中有不同的实现方法,比如SQL中使用case+group,或者Power BI的M语言中用拖放组件实现.今天正好 ...

随机推荐

  1. 【转】杭电ACM试题分类

    注:网上搜的 第一篇 1001 这个就不用说了吧1002 简单的大数1003 DP经典问题,最大连续子段和1004 简单题1005 找规律(循环点)1006 感觉有点BT的题,我到现在还没过1007 ...

  2. idea修改文件名后出现main method should be static错误

    1.确保你有main方法 2.别忘了main方法里还有参数: String[] args

  3. 依赖注入(DI)和控制反转(IOC)

    依赖注入(DI)和控制反转(IOC) 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只 ...

  4. MySQL show binglog event in 'log_name'

    二进制日志文件记录的内容:记录表的更改. 二进制日志文件记录的形式:基于语句的复制.基于行的复制. 两种记录形式的优点与不足: 基于语句的复制-->它不能保证复制的正确性.如随机函数可能在两台机 ...

  5. 7篇Model View和4篇双缓冲

    http://www.cnblogs.com/SkylineSoft/category/299475.html

  6. HttpWebRequest使用注意(发生阻塞的解决办法)

    原文 http://www.cnblogs.com/Fooo/archive/2008/10/31/1323400.html HttpWebRequest使用注意(发生阻塞的解决办法) , count ...

  7. 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案

    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...

  8. 某IT校招笔试

    前言 博主明天上午9点还有面试,今天突然看到某大牌IT公司笔试题目,必须做一下了 题目 1.假设把整数关键码K散列到N个槽列表,以下哪些散列函数是好的散列函数 A: h(K)=K/N; B: h(K) ...

  9. 日常之学习CSS3变形和js函数指针

    1,transform变形属性,包括rotate(xxdeg)旋转,translate(x轴px,y轴px)移动,scale(0.5,2)变形(x轴缩小0.5倍,y轴放大2倍),skew(x轴deg, ...

  10. js 去除字符串左右两端的空格

    <script type="text/javascript"> function trim(str){ //删除左右两端的空格      return str.repl ...