惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
Intezer
V
Vulnerabilities – Threatpost
Google Online Security Blog
Google Online Security Blog
T
The Exploit Database - CXSecurity.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
AWS News Blog
AWS News Blog
G
GRAHAM CLULEY
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Cybersecurity and Infrastructure Security Agency CISA
N
News | PayPal Newsroom
T
Tenable Blog
Spread Privacy
Spread Privacy
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Secure Thoughts
P
Privacy International News Feed
IT之家
IT之家
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
博客园_首页
GbyAI
GbyAI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
雷峰网
雷峰网
Apple Machine Learning Research
Apple Machine Learning Research
Hacker News: Ask HN
Hacker News: Ask HN
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
NISL@THU
NISL@THU
I
InfoQ
D
DataBreaches.Net
有赞技术团队
有赞技术团队
K
Kaspersky official blog
Security Latest
Security Latest
The Register - Security
The Register - Security
Hugging Face - Blog
Hugging Face - Blog
S
Security @ Cisco Blogs
P
Proofpoint News Feed
M
MIT News - Artificial intelligence
H
Hackread – Cybersecurity News, Data Breaches, AI and More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
AI
AI
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
N
News and Events Feed by Topic

博客园 - CsharpFish

Lodop使用之WEB套打程序开发 jquery插件treeTable Asp.net 后台添加CSS、JS、Meta标签的写法 DataGridView拖动换行 CodeSmith----SchemaExplorer类结构详细介绍 - CsharpFish - 博客园 js request 应用举例 背景图片随窗口拉伸 WebBrowser网页局部打印 - CsharpFish - 博客园 js日期控件-梅花雨 利用VML生成柱状图和饼图 js操作Table绑定DataSet 小小个人消费管理系统(已完善) GridView分页用户自定义控件 DbType与OleDbType 添加修改后返回刷新查询页面 asp.net页面传值(transfer Context.Handler) GridViev皮肤(Skin&CSS) JavaScript验证控件并阻止表单提交 GridView自定义分页存储过程
Sql2005 PIVOT运算符的操作
CsharpFish · 2013-05-07 · via 博客园 - CsharpFish

      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 o
    JOIN NorthWind..[Order Details] AS od
        ON 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
           ,OrderQty
    FROM Production.WorkOrder
)WorkOrder
    PIVOT (
           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的使用

   对该动态pivot增加汇总列

生成汇总列的注意事项;
    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