最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入SQL中PIVOT 行列轉(zhuǎn)換詳解

 更新時間:2015年10月20日 14:57:40   投稿:mrr  
T-SQL語句中,Pivot運算符用于在列和行之間對數(shù)據(jù)進(jìn)行旋轉(zhuǎn)或透視轉(zhuǎn)換,PIVOT命令可以實現(xiàn)數(shù)據(jù)表的列轉(zhuǎn)行,同時執(zhí)行聚合運算,UNPIVOT則與其相反,實現(xiàn)數(shù)據(jù)的行轉(zhuǎn)列。

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

通俗簡單的說:PIVOT就是行轉(zhuǎn)列,UNPIVOT就是列傳行

一、PIVOT實例

1. 建表

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

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

2. 填入表數(shù)據(jù)

使用如下程序填入表數(shù)據(jù)。

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)、使用傳統(tǒng)Select的CASE語句查詢

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

  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

得到的結(jié)果如下:

(2)、使用PIVOT

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

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

得到的結(jié)果如下:


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

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

三.UNPIVOT

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

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

UNPIVOT實例

CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
 Emp3 int, Emp4 int, Emp5 int);
GO
INSERT 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, Orders
FROM 
 (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
 FROM pvt) p
UNPIVOT
 (Orders FOR Employee IN 
  (Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt;
GO

上面UNPIVOT實例的分析

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

相關(guān)文章

  • SQL之left join、right join、inner join的區(qū)別淺析

    SQL之left join、right join、inner join的區(qū)別淺析

    這篇文章主要介紹了SQL之left join、right join、inner join的區(qū)別淺析,本文講解了它們的區(qū)別并給出了實例,需要的朋友可以參考下
    2015-02-02
  • MSSQL轉(zhuǎn)MYSQL的一些記錄

    MSSQL轉(zhuǎn)MYSQL的一些記錄

    今天把一個MSSQL的數(shù)據(jù)庫轉(zhuǎn)成MYSQL,在沒有轉(zhuǎn)換工具的情況下,對于字段不多的數(shù)據(jù)表我用了如下手功轉(zhuǎn)換的方法,還算方便。MSSQL使用企業(yè)管理器操作,MYSQL用phpmyadmin操作。
    2010-02-02
  • JDBC常用接口總結(jié)

    JDBC常用接口總結(jié)

    這篇文章主要介紹了JDBC常用接口總結(jié),以及部分使用代碼語句,需要的朋友可以參考下。
    2017-09-09
  • 達(dá)夢數(shù)據(jù)庫DISQL連接數(shù)據(jù)庫與執(zhí)行SQL、腳本的方法圖文詳解

    達(dá)夢數(shù)據(jù)庫DISQL連接數(shù)據(jù)庫與執(zhí)行SQL、腳本的方法圖文詳解

    DIsql是DM數(shù)據(jù)庫的一個命令行客戶端工具,跟Oracle數(shù)據(jù)庫的sqlplus工具一樣,用來與?DM?數(shù)據(jù)庫服務(wù)器進(jìn)行交互,這篇文章主要給大家介紹了關(guān)于達(dá)夢數(shù)據(jù)庫DISQL連接數(shù)據(jù)庫與執(zhí)行SQL、腳本的方法,需要的朋友可以參考下
    2024-09-09
  • SQL中where子句與having子句的區(qū)別小結(jié)

    SQL中where子句與having子句的區(qū)別小結(jié)

    這篇文章主要給大家介紹了關(guān)于SQL中where子句與having子句的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 關(guān)于DBeaver安裝與使用圖文教程分享

    關(guān)于DBeaver安裝與使用圖文教程分享

    DBeaver是一個通用的數(shù)據(jù)庫管理工具和SQL客戶端,支持多種數(shù)據(jù)庫,本文介紹了DBeaver的下載和安裝過程,并以連接MySQL數(shù)據(jù)庫為例,展示了如何填寫數(shù)據(jù)庫信息和使用常用基本功能
    2024-11-11
  • SQL中Having與Where的區(qū)別及注意

    SQL中Having與Where的區(qū)別及注意

    這篇文章給大家詳細(xì)的介紹了SQL中Having與Where的區(qū)別,以及這兩者的注意事項,文中還分享了Having與Where的示例代碼,相信對大家的理解和學(xué)習(xí)很有幫助,感興趣的朋友們可以參考借鑒,有需要的朋友們可以一起學(xué)習(xí)學(xué)習(xí)。
    2016-11-11
  • JDBC中resutset接口操作實例詳解

    JDBC中resutset接口操作實例詳解

    這篇文章主要介紹了JDBC中resutset接口操作實例詳解,代碼示例注釋比較詳細(xì),需要的朋友可以參考下。
    2017-09-09
  • 本地SQL注射攻略分析曝光

    本地SQL注射攻略分析曝光

    以后會陸續(xù)給大家講一些本人的入侵經(jīng)驗,一天學(xué)一點,這東西雖然我玩膩了,但是還是很想給大家入門時的一些幫助。本地SQL注射,可能很多朋友都沒有聽說過,下面biweilun為大家講解下概念及其應(yīng)用
    2008-07-07
  • 詳解Navicat Premium基本使用

    詳解Navicat Premium基本使用

    Navicat是一套數(shù)據(jù)庫管理工具,專為簡化數(shù)據(jù)庫的管理及降低系統(tǒng)管理成本而設(shè)。這篇文章主要介紹了詳解Navicat Premium基本使用,需要的朋友可以參考下
    2020-11-11

最新評論

崇仁县| 新源县| 石狮市| 甘南县| 夏津县| 镇雄县| 曲阳县| 儋州市| 海口市| 辉县市| 通州区| 泾川县| 壶关县| 松原市| 景宁| 和顺县| 辰溪县| 垦利县| 来凤县| 柯坪县| 长治县| 华坪县| 巴林右旗| 体育| 高台县| 神木县| 勐海县| 昭通市| 建始县| 图木舒克市| 丰都县| 上思县| 永川市| 大同市| 雷山县| 汨罗市| 福建省| 巩义市| 崇州市| 永泰县| 石屏县|