Sql2005 PIVOT运算符的操作

      PIVOT,UNPIVOT运算符是SQL server 2005支持的新功能之一,主要用来实现行到列的转换。本文主要介绍PIVOT运算符的操作,以及如何实现动态PIVOT的行列转换。      

一、PIVOT的语法

 

SELECT [non-pivoted column], -- optional [additional non-pivoted columns], -- optional [first pivoted column], [additional pivoted columns] 
FROM ( SELECT query producing sql data for pivot -- select pivot columns as dimensions and -- value columns as measures from sql tables 
) AS TableAlias 
PIVOT 
( <aggregation function>(column for aggregation or measure column) -- MIN,MAX,SUM,etc FOR [] IN ( [first pivoted column], ..., [last pivoted column] ) 
) AS PivotTableAlias 
ORDER BY clause – optional

 

 

 

1. 静态PIVOT的用法
       为演示,从NorthWind数据库中提取一些记录生成新的Orders表,然后使用PIVOT将行转换到列。

USE tempdb
GO
SELECT YEAR(OrderDate) AS [Year],CustomerID ,od.Quantity
INTO dbo.Orders       
FROM NorthWind..Orders AS oJOIN NorthWind..[Order Details] AS odON o.OrderID = od.OrderID
WHERE o.CustomerID IN ('BONAP','BOTTM','ANTON')
SELECT CustomerID,[1996],[1997],[1998]
FROM dbo.Orders
PIVOT (SUM(Quantity)FOR [Year] IN ([1996],[1997],[1998]))x
/*               
TSQL中pivot的结构:●  用于生成pivot数据源的源表,作为一个输入表●  pivot表●  聚合列及透视列的选择TSQL中pivot的实现:
1->上例中Orders表相当于是一个输入表。包含了CustomerID,[Year],Quantity 三个列。Year是透视列,用于生成维度。pivot首先将聚合列之外的列进行分组,并对其实现聚合。本列中则是对聚合列Quantity之外的列先实现分组,即对CustomerID,Year进行分组,并对其Quantity实现聚合,相当于先做如下处理:
*/                 
SELECT CustomerID,[Year],SUM(Quantity) AS Total
FROM dbo.Orders
GROUP BY CustomerID,[Year]
ORDER BY CustomerID               /*    Result:           
CustomerID Year        Total
---------- ----------- -----------
ANTON      1996        24
ANTON      1997        295
ANTON      1998        40
BONAP      1996        181
BONAP      1997        486
BONAP      1998        313
BOTTM      1996        81
BOTTM      1997        454
BOTTM      1998        421
*/
/*
2->pivot根据FOR [Year] IN子句中的值,在结果集中来建立对应的新列,本例中即是列,,对于新列,,中的取值,取中间结果集中与之相对应的值。如对于客户ANTON,1996列中的值就选择中间结果中对应的Total值,同理列中为。并将中间结果pivot表命名为x。3->最外层的SELECT语句从pivot表生成最终结果,此处因Orders表仅有列,故直接将结果用一个SELECT返回,有嵌套的SELECT参照下例。--结果:  
CustomerID 1996        1997        1998
---------- ----------- ----------- -----------
ANTON      24          295         40
BONAP      181         486         313
BOTTM      81          454         421
*/         以下是为输入表多于一列的例子,数据来源于SQL server 2005的AdventureWorks,其实现的原理同上。
SELECT *  
FROM(SELECT YEAR(DueDate) [Year],CASE MONTH(DueDate)WHEN 1 THEN 'January' WHEN 2 THEN 'February'WHEN 3 THEN 'March'WHEN 4 THEN 'April'WHEN 5 THEN 'May'WHEN 6 THEN 'June'WHEN 7 THEN 'July'WHEN 8 THEN 'August'WHEN 9 THEN 'September'WHEN 10 THEN 'October'WHEN 11 THEN 'November'WHEN 12 THEN 'December'END as [Month],ProductID,OrderQtyFROM Production.WorkOrder
)WorkOrderPIVOT (SUM(OrderQty)FOR [Month] IN ([January],[February],[March],[April],[May],[June],[July],[August],[September],[October],[November],[December]))x
ORDER BY [Year], ProductID  
--Result: 末尾部分省略
/*  
Year        ProductID   January     February    March       April       May         June        July        August      
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
2002        3           8480        16870       12960       9530        19390       14170       26200       35870             
2002        316         1842        3704        2910        2252        4738        3496        7624        10778          
2002        324         1842        3704        2910        2252        4738        3496        7546        10600            
2002        327         921         1852        1455        1126        2369        1748        3773        5300              
2002        328         414         1048        872         458         1272        992         1786        2632         
*/

 


2. 动态PIVOT的使用

USE AdventureWorks;
GO --第一种生成透视列的方法,使用了COALESCE来联接字符串
DECLARE @PivotColHeader VARCHAR(MAX)    
SELECT @PivotColHeader =COALESCE(@PivotColHeader + ',[' + cast(Name as varchar) + ']','[' + cast(Name as varchar) + ']')   --示例中Name转换为varchar或char类型,注意:在CAST 和CONVERT 中使用varchar 时,显示n的默认值为30
FROM Sales.SalesTerritory
GROUP BY Name/*
--第二种生成透视列的方法,使用了FOR XML PATH方法
SELECT @PivotColHeader = STUFF((     SELECT DISTINCT ',[' + cast(Name as varchar) + ']'FROM Sales.SalesTerritoryFOR XML PATH('')),1,1,'')
*/DECLARE @PivotTableSQL NVARCHAR(MAX)
SET @PivotTableSQL = N'SELECT *FROM (SELECT YEAR(H.OrderDate) [Year],T.Name,H.TotalDueFROM Sales.SalesOrderHeader HLEFT JOIN Sales.SalesTerritory TON H.TerritoryID = T.TerritoryID)AS PivotDataPIVOT(SUM(TotalDue)FOR Name IN (' + @PivotColHeader + ')) AS x '                            
EXECUTE sp_executesql @PivotTableSQL    --Result:部分结果省略
/*
Year        Australia             Canada                Central               France                Germany               Northeast             
----------- --------------------- --------------------- --------------------- --------------------- --------------------- --------------------- 
2001        1446497.1744          2173647.1453          1263884.1024          199531.723            262752.4184           754833.2045           
2002        2380484.8387          7215430.5017          3518185.4756          1717145.7439          575960.0974           3275322.1694          
2003        4547123.2777          8186021.9178          4015356.874           4366078.3475          2714826.4297          3833030.25           
2004        3823410.2386          3926712.8926          1771532.7396          2853948.6596          2386224.5508          1406555.6861         */   

 

   对该动态pivot增加汇总列

DECLARE @PivotColHeader VARCHAR(MAX)
DECLARE @TotalCol VARCHAR(MAX)SELECT @PivotColHeader =                              --使用COALESCE函数生成列标题COALESCE(@PivotColHeader + ',[' + cast(Name as varchar) + ']','[' + cast(Name as varchar) + ']'),@TotalCol = COALESCE(@TotalCol + ', SUM([' + cast(Name as varchar) + ']) AS [' + cast(Name as varchar) + ']','SUM([' + cast(Name as varchar) + ']) AS [' + cast(Name as varchar) + ']')     --使用COALESCE函数生成汇总字符串
FROM Sales.SalesTerritoryDECLARE @PivotTableSQL NVARCHAR(MAX)
SET @PivotTableSQL = N'SELECT *FROM (SELECT CAST(YEAR(H.OrderDate) AS CHAR(4)) [Year],T.Name,H.TotalDueFROM Sales.SalesOrderHeader HLEFT JOIN Sales.SalesTerritory TON H.TerritoryID = T.TerritoryID)AS PivotDataPIVOT(SUM(TotalDue)FOR Name IN (' + @PivotColHeader + ')) AS x   UNION SELECT ''GrandTotal'', ' + @TotalCol + 'FROM (SELECT CAST(YEAR(H.OrderDate) AS CHAR(4)) [Year],T.Name,H.TotalDueFROM Sales.SalesOrderHeader HLEFT JOIN Sales.SalesTerritory TON H.TerritoryID = T.TerritoryID) AS PivotData                                                    PIVOT(SUM(TotalDue)FOR Name IN (' + @PivotColHeader + ')) AS y '   
--PRINT  @PivotTableSQL                                        
EXECUTE sp_executesql @PivotTableSQL --Result:部分结果省略
/*
Year       Australia             Canada                Central               France                Germany               Northeast             Northwest             
---------- --------------------- --------------------- --------------------- --------------------- --------------------- --------------------- --------------------- 
2001       1446497.1744          2173647.1453          1263884.1024          199531.723            262752.4184           754833.2045           2703481.7947          
2002       2380484.8387          7215430.5017          3518185.4756          1717145.7439          575960.0974           3275322.1694          5651688.6685          
2003       4547123.2777          8186021.9178          4015356.874           4366078.3475          2714826.4297          3833030.25            7494658.0357          
2004       3823410.2386          3926712.8926          1771532.7396          2853948.6596          2386224.5508          1406555.6861          4952772.2793          
GrandTotal 12197515.5294         21501812.4574         10568959.1916         9136704.474           5939763.4963          9269741.31            20802600.7782         
*/    

生成汇总列的注意事项;
    1->使用COALESCE函数生成列标题 。
    2->使用COALESCE函数生成带有SUM求和函数并且指定了别名的字符串。
    3->使用UNION对两个SELECT来实现联接。且将[Year]转换为字符串,因为YEAR(H.OrderDate)得值为 INT ,而''GrandTotal''为字符串,UNION 或UNION ALL使用时必须列的数量和类型相对应。

 

引用地址:http://blog.csdn.net/robinson_0612/article/details/5385117

转载于:https://www.cnblogs.com/hongyuniu/archive/2013/05/07/3064911.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英特尔反驳质疑:芯片供应充足、10nm量产没问题

来源&#xff1a;华尔街见闻摘要&#xff1a;英特尔称2018年会将资本支出增加10亿美元&#xff0c;至总额创纪录的150亿美元&#xff1b;CEO称&#xff0c;个人电脑需求意外回升&#xff0c;但有足够供应满足市场&#xff0c;有望达成全年营收目标&#xff0c;股价涨近4%。竞争…

windows下的_mkdir函数

创建目录函数_mkdir(path)&#xff0c;返回0表示成功&#xff0c;-1失败 只能创建一级目录&#xff0c;即path倒数第二级必须是已经存在&#xff0c;否则创建不成功。 举个例子。 现在D盘下为空&#xff0c;什么都没有 path"d:/A/B/C" int result_mkdir(path); resul…

RecyclerView拖拽排序和滑动删除实现

效果图 如何实现 那么是如何实现的呢&#xff1f;主要就要使用到ItemTouchHelper &#xff0c;ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类&#xff0c;它能够让你非常容易实现侧滑删除、拖拽的功能。 实现的代码非常简单我们只需要两步&#xff1a; 实例化…

马斯克刚刚宣布辞去特斯拉董事会职务,仍然担任CEO

来源&#xff1a;大数据文摘编译&#xff1a;蒋宝尚据悉&#xff0c;当地时间周六&#xff0c;马斯克辞去特斯拉董事会主席一职&#xff0c;并且支付2000万美元罚款。以表示对美国证券交易委员会(SEC)指控的回应。SEC的指控来源于马斯克8月7日的一篇推文。推文中&#xff0c;他…

JavaScript 实现 GriwView 单列全选

在 GridView 里有一系列的 Checkbox &#xff0c;要实现对其全选或全不选。开始在网上找了&#xff0c;但是参考的代码会全选 GridView 里所有的 Checkbox &#xff0c;而我要的是单列全选。如图&#xff1a; 审核和权限是要分开的。 我自己写了 JavaScript 代码&#xff0c;贴…

自然语言处理(NLP)前沿进展报告

来源&#xff1a;专知摘要&#xff1a;2018年9 月 9 日-14 日&#xff0c;DeepMind主办的Deep Learning Indaba 2018 大会在南非斯泰伦博斯举行。会上&#xff0c;斯坦陵布什大学Herman Kamper和AYLIEN的Sebastian Ruder等专家做了《自然语言处理前言进展》的报告。报告首先探讨…

Android下利用Bitmap切割图片

在自己自定义的一个组件中由于需要用图片显示数字编号&#xff0c;而当前图片就只有一张&#xff0c;上面有0-9是个数字&#xff0c;于是不得不考虑将其中一个个的数字切割下来&#xff0c;需要显示什么数字&#xff0c;只需要组合一下就好了。 下面是程序的关键代码&#xff…

sap 登陆增强

SAP用户登录增强&#xff0c;对用户GUI登录有效&#xff0c;但对RFC访问登录(例如JCO)无效。增强类型是CMOD/SMOD&#xff0c;增强出口(exit)是SUSR0001。 一、增强操作步骤 tcode smod,”加强” 输入SUSR0001,”对象组件”选择”组件”&#xff0c;点击“修改”。双击功能模块…

两种不同的人工智能观:工程观点和科学观点

来源&#xff1a;人机与认知实验室作者按&#xff1a;人工智能是作为工程还是科学&#xff0c;这个问题是一个很严肃的问题&#xff0c;如果从工程技术角度来看人工智能&#xff0c;那么认知科学尤其是认知心理学、神经生理学对人类这样的生物智能的原理性认识&#xff0c;就不…

Hibernate常见问题

问题1&#xff0c;hql条件查询报错 执行Query session.createQuery(hql) 报错误直接跳到finally 解决方案 加入 <prop key"hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop> 节点 加入之后再次报错…

一个Excel导出类的实现过程(一):泛型与反射

对数据进行导出要求很常见&#xff0c;我们需要通用便离不了泛型和反射。这里从伪码开始&#xff0c;逐步加入业务需求、场景及边界&#xff0c;最终使用NPOI组件实现。 准备好业务中的实体类准备好&#xff1a; public class Person {public Int32 ID { get; set; }public Str…

BaseActivity与BaseFragment的封装

这篇博客主要是从BaseActivity与BaseFragment的封装开始&#xff0c;总结我们在实战开发中关于Fragment的注意事项以及心得体会。 先看以下效果图&#xff1a; 这里模拟的是用户登录模块&#xff0c;你可能会说&#xff0c;很普通的效果嘛&#xff0c;这有啥。嘿嘿&#xff0c…

学界 | 史上最强GAN图像生成器,Inception分数提高两倍

来源&#xff1a;Openreview,机器之心摘要&#xff1a;ICLR 2019 大会即将在明年 5 月 6 日于美国举行&#xff0c;9 月 27 日论文提交截止时间已过。本次大会共接收到了 1591 篇论文的投稿&#xff0c;数量相较今年的 1000 篇提升了近 60%。在双盲评审时&#xff0c;人们可以在…

Android之Bundle类

API文档说明 1.介绍 用于不同Activity之间的数据传递 1.重要方法 clear()&#xff1a;清除此Bundle映射中的所有保存的数据。clone()&#xff1a;克隆当前BundlecontainsKey(String key)&#xff1a;返回指定key的值getString(String key)&#xff1a;返回指定key的字符has…

一图理解腾讯本次组织结构重大变革的方向和目的

作者&#xff1a;刘锋 互联网进化论作者 计算机博士2018年9月30日&#xff0c;腾讯宣布公司架构调整&#xff0c;在原有七个事业群的基础上进行重组整合&#xff0c;形成新的6个事业群&#xff0c;在本次调整中&#xff0c;腾讯新成立了云与智慧产业事业群&#xff08;CSIG&…

Android中的AutoCompleteTextView组件

1 http://cn.bing.com/images?FORMZ9LH1 2 后续补充 转载于:https://www.cnblogs.com/bavariama/archive/2013/05/21/3090768.html

Android实现边缘凹凸的View

转载 最近做项目的时候遇到一个卡劵的效果&#xff0c;由于自己觉得用图片来做的话可以会出现适配效果不好&#xff0c;再加上自己自定义view方面的知识比较薄弱&#xff0c;所以想试试用自定义View来实现。但是由于自己知识点薄弱&#xff0c;一开始居然想着用画矩形来设置边…

【报告解读】126个国家、29个行业、36位高管认为AI的未来这么走

来源&#xff1a;网易智能人工智能&#xff08;AI&#xff09;已经使早期采用它的制造商能够更好地协调分析、商业智能(BI)、移动性和实时监控&#xff0c;以实现更快的营收增长&#xff0c;并比同行更快地成长壮大。如今&#xff0c;最顶级的18%的AI采用者将超过70%的精力投入…

热敏打印机应用笔记

热敏电打印机在PS机上应用比较广泛。造型需要考滤的参数有&#xff1a; 1、打印方式&#xff1a;热敏&#xff0c;针式等等&#xff1b; 2、打印纸度&#xff1a;影响一行能打的字数&#xff1b; 3、打印密度&#xff1a;影响线的粗细&#xff0c;单位 点/mm 或是 点/行 4、打印…

自定义view实现水波纹效果

水波纹效果&#xff1a; 1.标准正余弦水波纹&#xff1b; 2.非标准圆形液柱水波纹&#xff1b; 虽说都是水波纹&#xff0c;但两者在实现上差异是比较大的&#xff0c;一个通过正余弦函数模拟水波纹效果&#xff0c;另外一个会运用到图像的混合模式&#xff08;PorterDuffXf…