行专列 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. jquery实现锚点动画效果

    锚点相信大家都使用过吧!点击后僵硬的切换是不是很不爽呢? 下面分享一个小技巧,根据锚点offset值来实现动画切换 <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  2. codeforces 632D. Longest Subsequence 筛法

    题目链接 记录小于等于m的数出现的次数, 然后从后往前筛, 具体看代码. #include <iostream> #include <vector> #include < ...

  3. poj 3469 Dual Core CPU 最小割

    题目链接 好裸的题....... 两个cpu分别作为源点和汇点, 每个cpu向元件连边, 权值为题目所给的两个值, 如果两个元件之间有关系, 就在这两个元件之间连边, 权值为消耗,这里的边应该是双向边 ...

  4. .NET 条件查询实现--类似网上商城宝贝搜索

    需要实现的效果:点击表格列头:弹出一个层,用户可以输入当前列头的查询条件,点击确定之后,把该列头的查询信息显示在页面顶部,用户可以叉掉这个查询条件,恢复到查询之前的数据. 大致实现的效果图: 项目背景 ...

  5. 10_Segue Example

    10 // // ViewController.swift // Segues Example // // Created by ZC on 16/1/10. // Copyright © 2016年 ...

  6. android studio 实现代码混淆

    =======本文章属于转载==========原文章地址:http://my.oschina.net/aibenben/blog/370985 这篇文章等是跟大家分享一在Android studio ...

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

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

  8. mongoose查询特定时间段文档的方法

    db.collection.find({ time:{ "$gte": new Date('2014-01-24'), "$lte":new Date('201 ...

  9. poj 1815 Friendship (最小割+拆点+枚举)

    题意: 就在一个给定的无向图中至少应该去掉几个顶点才干使得s和t不联通. 算法: 假设s和t直接相连输出no answer. 把每一个点拆成两个点v和v'',这两个点之间连一条权值为1的边(残余容量) ...

  10. UI基础:UILabel.UIFont

    UILabel:标签 继承自UIView ,在UIView基础上扩充了显示文本的功能.(文本框) UILabel的使用步骤 1.创建控件 UILabel *aLabel=[[UILabel alloc ...