亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > 文庫 > 正文

深入SQL中PIVOT 行列轉換詳解

2020-10-29 21:49:07
字體:
來源:轉載
供稿:網友

PIVOT通過將表達式某一列中的唯一值轉換為輸出中的多個列來旋轉表值表達式,并在必要時對最終輸出中所需的任何其余列值執行聚合。UNPIVOT與PIVOT執行相反的操作,將表值表達式的列轉換為列值。

通俗簡單的說:PIVOT就是行轉列,UNPIVOT就是列傳行

一、PIVOT實例

1. 建表

建立一個銷售情況表,其中,year字段表示年份,quarter字段表示季度,amount字段表示銷售額。quarter字段分別用Q1, Q2, Q3, Q4表示一、二、三、四季度。

 CREATE TABLE SalesByQuarter ( year INT, -- 年份  quarter CHAR(2), -- 季度  amount MONEY -- 總額 )

2. 填入表數據

使用如下程序填入表數據。

SET NOCOUNT ON DECLARE @index INT DECLARE @q INT SET @index = 0 DECLARE @year INT while (@index < 30) BEGIN  SET @year = 2005 + (@index % 4)  SET @q = (CAST((RAND() * 500) AS INT) % 4) + 1  INSERT INTO SalesByQuarter VALUES (@year, 'Q' + CAST(@q AS CHAR(1)), RAND() * 10000.00)  SET @index = @index + 1

3、如果我們要比較每年中各季度的銷售狀況,要怎么辦呢?有以下兩種方法:

(1)、使用傳統Select的CASE語句查詢

在SQL Server以前的版本里,將行級數據轉換為列級數據就要用到一系列CASE語句和聚合查詢。雖然這種方式讓開發人員具有了對所返回數據進行高度控制的能力,但是編寫出這些查詢是一件很麻煩的事情。

  SELECT year as 年份  , sum (case when quarter = 'Q1' then amount else 0 end) 一季度  , sum (case when quarter = 'Q2' then amount else 0 end) 二季度  , sum (case when quarter = 'Q3' then amount else 0 end) 三季度  , sum (case when quarter = 'Q4' then amount else 0 end) 四季度 FROM SalesByQuarter GROUP BY year ORDER BY year DESC

得到的結果如下:

(2)、使用PIVOT

由于SQL Server 2005有了新的PIVOT運算符,就不再需要CASE語句和GROUP BY語句了。(每個PIVOT查詢都涉及某種類型的聚合,因此你可以忽略GROUP BY語句。)PIVOT運算符讓我們能夠利用CASE語句查詢實現相同的功能,但是你可以用更少的代碼就實現,而且看起來更漂亮。

SELECT year as 年份, Q1 as 一季度, Q2 as 二季度, Q3 as 三季度, Q4 as 四季度 FROM SalesByQuarter PIVOT (SUM (amount) FOR quarter IN (Q1, Q2, Q3, Q4) ) AS P ORDER BY YEAR DESC

得到的結果如下:


二、通過下面一個實例詳細介紹PIVOT的過程

SELECT [星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]--這里是PIVOT第三步(選擇行轉列后的結果集的列)這里可以用“*”表示選擇所有列,也可以只選擇某些列(也就是某些天)FROM WEEK_INCOME --這里是PIVOT第二步驟(準備原始的查詢結果,因為PIVOT是對一個原始的查詢結果集進行轉換操作,所以先查詢一個結果集出來)這里可以是一個select子查詢,但為子查詢時候要指定別名,否則語法錯誤PIVOT( SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])--這里是PIVOT第一步驟,也是核心的地方,進行行轉列操作。聚合函數SUM表示你需要怎樣處理轉換后的列的值,是總和(sum),還是平均(avg)還是min,max等等。例如如果week_income表中有兩條數據并且其week都是“星期一”,其中一條的income是1000,另一條income是500,那么在這里使用sum,行轉列后“星期一”這個列的值當然是1500了。后面的for [week] in([星期一],[星期二]...)中 for [week]就是說將week列的值分別轉換成一個個列,也就是“以值變列”。但是需要轉換成列的值有可能有很多,我們只想取其中幾個值轉換成列,那么怎樣取呢?就是在in里面了,比如我此刻只想看工作日的收入,在in里面就只寫“星期一”至“星期五”(注意,in里面是原來week列的值,"以值變列")??偟膩碚f,SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])這句的意思如果直譯出來,就是說:將列[week]值為"星期一","星期二","星期三","星期四","星期五","星期六","星期日"分別轉換成列,這些列的值取income的總和。)TBL--別名一定要寫

三.UNPIVOT

很明顯,UN這個前綴表明了,它做的操作是跟PIVOT相反的,即列轉行。UNPIVOT操作涉及到以下三個邏輯處理階段。

1,生成副本
2,提取元素
3,刪除帶有NULL的行

UNPIVOT實例

CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int, Emp3 int, Emp4 int, Emp5 int);GOINSERT INTO pvt VALUES (1,4,3,5,4,4);INSERT INTO pvt VALUES (2,4,1,5,5,5);INSERT INTO pvt VALUES (3,4,3,5,4,4);INSERT INTO pvt VALUES (4,4,2,5,5,4);INSERT INTO pvt VALUES (5,5,1,5,5,5);GO--Unpivot the table.SELECT VendorID, Employee, OrdersFROM  (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5 FROM pvt) pUNPIVOT (Orders FOR Employee IN   (Emp1, Emp2, Emp3, Emp4, Emp5))AS unpvt;GO

上面UNPIVOT實例的分析

UNPIVOT的輸入是左表表達式P,第一步,先為P中的行生成多個副本,在UNPIVOT中出現的每一列,都會生成一個副本。因為這里的IN子句有5個列名稱,所以要為每個來源行生成5個副本。結果得到的虛擬表中將新增一個列,用來以字符串格式保存來源列的名稱(for和IN之間的,上面例子是 Employee )。第二步,根據新增的那一列中的值從來源列中提取出與列名對應的行。第三步,刪除掉結果列值為null的行,完成這個查詢。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人国产精品日本在线| 欧美日韩亚洲一区二| 久久久久久久久久久免费精品| 一区二区三区亚洲| 97久久久免费福利网址| 国产精品嫩草视频| 亚洲自拍偷拍区| 精品视频在线播放免| 国产va免费精品高清在线| 成人www视频在线观看| 亚洲男人天堂手机在线| 九九久久久久99精品| 亚洲第一页中文字幕| 亚洲精品视频免费| 亚洲第一男人天堂| 国产日韩欧美黄色| 视频一区视频二区国产精品| 精品国产一区二区三区久久久| 欧美性videos高清精品| 国产精品视频导航| 日韩欧美亚洲国产一区| 国产精品1区2区在线观看| 国产免费久久av| 国产精品免费视频xxxx| 狠狠色狠狠色综合日日五| 日韩福利伦理影院免费| 色无极影院亚洲| 精品久久香蕉国产线看观看亚洲| 欧美大人香蕉在线| 国产欧美一区二区三区视频| 亚洲欧美综合区自拍另类| 欧美黄色成人网| 91午夜理伦私人影院| 国产在线观看一区二区三区| 欧美激情视频网址| 成人h视频在线观看播放| 欧美日韩国产999| 久久精品国产亚洲精品2020| 国产精品mp4| 国产99久久精品一区二区| 亚洲精品乱码久久久久久金桔影视| 国产精品久久久久久久久| 欧美日韩美女在线观看| 久久免费观看视频| 亚洲精品成人久久久| 欧美性猛交xxxx富婆弯腰| 亚洲成人av片在线观看| 精品视频9999| 日韩性xxxx爱| 日韩av影院在线观看| 国产精品永久免费在线| 亚洲一区二区三区在线视频| 美女福利精品视频| 国产精品一区二区三区久久久| 欧美疯狂做受xxxx高潮| 91精品国产电影| 91精品中国老女人| 欧美精品aaa| 97热精品视频官网| 日韩中文字在线| 国产成人精品久久久| 国产视频久久久| 91久久精品日日躁夜夜躁国产| 国产97色在线|日韩| 91久久精品视频| 亚洲精品福利在线| 久久久国产视频91| 欧美日韩成人免费| 色综合久综合久久综合久鬼88| 国产成人精品久久亚洲高清不卡| 91精品国产91久久久久久最新| 亚洲自拍偷拍福利| 欧美性20hd另类| 在线观看精品自拍私拍| 91chinesevideo永久地址| 在线播放日韩精品| 亚洲欧美日韩视频一区| 久久久久久中文字幕| 日本精品一区二区三区在线| 成年无码av片在线| 日韩av三级在线观看| www.久久草.com| 欧美激情视频一区| 日韩成人高清在线| 久久中文字幕在线视频| 97视频免费在线观看| 亚洲男人天堂古典| 欧美成人激情图片网| 日韩精品免费在线视频| 久久九九全国免费精品观看| 日韩成人xxxx| 国产精品亚洲视频在线观看| 精品国产乱码久久久久酒店| 欧美大片va欧美在线播放| 午夜剧场成人观在线视频免费观看| 国产亚洲精品久久久久动| 亚洲大尺度美女在线| 中文字幕日韩免费视频| 久久久久国产精品免费网站| www.亚洲一二| 欧美色视频日本高清在线观看| 国产成人高潮免费观看精品| 中文字幕欧美精品在线| 国内外成人免费激情在线视频| 97av在线视频| 日本一区二三区好的精华液| 亚洲国产另类 国产精品国产免费| 欧美日韩国产综合新一区| 国产日韩在线一区| 亚洲精品永久免费| 欧美日韩在线视频首页| 国产乱人伦真实精品视频| 国产精品久久久久影院日本| 成人久久久久久久| 久久影视三级福利片| 日韩高清电影免费观看完整| 亚洲电影免费观看高清完整版在线观看| 国产精品第10页| 久久久久久久久久久国产| 欧美黑人xxx| 亚洲欧洲日产国码av系列天堂| 亚洲欧美国产视频| 日韩欧中文字幕| 福利视频一区二区| 亚洲成在人线av| 亚洲福利视频在线| 久久亚洲私人国产精品va| 在线日韩精品视频| 久久久亚洲国产| 国产日韩av在线| 亚洲自拍高清视频网站| 日韩精品在线免费| 亚洲女人被黑人巨大进入| 中文字幕国内精品| 成人黄色中文字幕| 久久精品成人动漫| 精品久久久久久久大神国产| 高清一区二区三区日本久| 高清日韩电视剧大全免费播放在线观看| 日韩亚洲精品视频| 国产视频丨精品|在线观看| 国产精品久久婷婷六月丁香| 国产精品网红福利| 亚洲欧美国产日韩中文字幕| 久久精品精品电影网| 日本高清视频精品| 日韩毛片在线观看| 91av视频在线观看| 91精品国产99久久久久久| 欧美在线观看日本一区| 国产成人极品视频| 国产一区二区三区久久精品| 精品成人69xx.xyz| 狠狠色狠色综合曰曰| 精品久久久久久国产91| 欧美一级淫片aaaaaaa视频| 国产丝袜一区视频在线观看| 日韩午夜在线视频| 欧美日韩国产页| 在线日韩第一页| 中文字幕欧美国内| 日韩精品在线电影| 美日韩精品免费观看视频| 成人午夜在线观看|