日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Sql2005 PIVOT运算符的操作

發布時間:2024/7/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的Sql2005 PIVOT运算符的操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 九色网址| 亚洲视频一二三 | 天天干天天干天天干 | 日韩欧美中文在线观看 | 成人性做爰aaa片免费 | 国精产品一区一区三区在线 | 中文亚洲av片在线观看 | 久久少妇视频 | av在线播放一区二区三区 | 超碰超碰超碰超碰 | 大又大又粗又硬又爽少妇毛片 | 成人日批 | 亚洲色图36p | ⅹxxxxhd亚洲日本hd老师 | 日本 片 成人 在线 九色麻豆 | 成人手机av | 牛牛av在线 | 激情久久视频 | 国产成人无码精品久久久性色 | 亚洲熟妇丰满大屁股熟妇 | 欧美一区二区三区久久成人精品 | 女同性做受全过程动图 | 香蕉视频最新网址 | 国产又粗又长又黄的视频 | 久久九九精品视频 | 性高潮免费视频 | 琪琪电影午夜理论片八戒八戒 | www.男人天堂.com | 亚洲精品国产成人久久av盗摄 | 亚洲自拍色图 | 成人免费毛片网站 | 久久久情 | 国产成人精品综合在线观看 | 国产精品女教师 | 91丝袜美腿 | 国产精品视频一区二区三区 | 久久视频一区二区三区 | 丝瓜av| 日韩在线一 | 成人区一区二区 | 一区二区三区四区免费 | 97精品人人妻人人 | 日日夜夜伊人 | 亚洲国产精华液网站w | 欧美色香蕉 | 少妇免费毛片久久久久久久久 | 日本黄色生活片 | 欧美日韩国产精品成人 | 中文字幕十一区 | 水蜜桃av无码 | 国产精品福利网站 | 天天弄| 人人插人人| 亚洲区小说区 | 免费视频福利 | 国产免费网址 | 成人毛片在线视频 | 国产精品毛片va一区二区三区 | 成人黄色激情视频 | 国产区一区二区三 | 日本r级电影在线观看 | 2019国产精品视频 | 欧美三级网 | 一级啪啪片 | 免费久久久久久 | 精品福利片| 黄色av片三级三级三级免费看 | 国产无套丰满白嫩对白 | 日韩网站免费观看 | 欧美在线你懂的 | 成人三级黄色 | 乱淫的女高中暑假调教h | 午夜一级在线 | 国产ts人妖系列高潮 | 高潮毛片 | 中文字幕在线视频第一页 | 99国内精品| 国产日韩视频 | 国产网红av| 国产aa视频 | 男ji大巴进入女人的视频 | 中文 日韩 欧美 | 亚洲性图一区二区三区 | 国产综合网站 | 欧美另类z0z变态 | 调教亲女小嫩苞h文小说 | xvideos成人免费视频 | 黄色a级片网站 | 久久精品欧美视频 | 亚洲乱码一区二区三区 | 不卡免费av | 亚洲专区中文字幕 | 伊伊综合网 | 午夜视频福利在线观看 | 国产婷婷色一区二区三区 | 国产女主播在线播放 | 欧美日韩视频一区二区三区 | 亚洲精品日韩丝袜精品 | 少妇在线观看 |