行专列 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. AndroidStudio 使用Hide API

    1.反射法 速度慢 2.生成新的android.jar 通常需要隐藏API的地方并不多 不需要整个都编译 而且编译出的framework.jar也不全 缺少java.*和javax.* 所以只把需要的 ...

  2. Linux ---> 监控JVM工具

    Linux ---> 监控JVM工具shkingshking 发布时间: 2013/10/10 01:27 阅读: 2642 收藏: 26 点赞: 1 评论: 0 JDK内置工具使用 jps(J ...

  3. Quick Tip: Outline Elements on Hover

    How to get the xpath by clicking an html element How to get the xpath by clicking an html element Qu ...

  4. UBER人民优步司机注册攻略

        注意:本文驾驶证行驶证图片为本人拍摄,请广大网友勿作它用 转载请修改! 详细的介绍注册优步uber司机端步骤; uber对司机的要求: 车辆为本地牌照 车龄在5年以内 裸车价格在10万以上 目 ...

  5. MZL's xor

    MZL's xor Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total Sub ...

  6. poj 2406 Power Strings(KMP变形)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 28102   Accepted: 11755 D ...

  7. STL-multimap

    转自:http://www.cnblogs.com/xiaoka/archive/2011/08/09/2132342.html multimap提供了可以一种可以有重复键值的STL map类型.其插 ...

  8. c# 遍历文件夹及其所有文件

    利用VS创建一个winform应用程序,遍历指定文件夹(photos)内的所有文件夹及其文件.具体程序如下: namespace 遍历文件夹及其所有文件 { public partial class ...

  9. 实现一个在autolayout下有宽度约束后,自动确定高度的view

    我曾经遇到过一个问题:需要实现一个自定义的label(类似于UILabel),同时需要兼顾UILabel的大小自适应的特性.这个label通常宽度是固定的,通过autolayout指定其宽度约束,但不 ...

  10. POJ 3461 Oulipo(模式串在主串中出现的次数)

    题目链接:http://poj.org/problem?id=3461 题意:给你两个字符串word和text,求出word在text中出现的次数 思路:kmp算法的简单应用,遍历一遍text字符串即 ...