欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

行轉(zhuǎn)列之SQL SERVER PIVOT與用法詳解

 更新時(shí)間:2019年09月05日 11:47:30   作者:灰色世界  
這篇文章主要給大家介紹了關(guān)于行轉(zhuǎn)列之SQL SERVER PIVOT與用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SQL SERVER具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

在數(shù)據(jù)庫操作中,有些時(shí)候我們遇到需要實(shí)現(xiàn)“行轉(zhuǎn)列”的需求,例如一下的表為某店鋪的一周收入情況表:

WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIMAL)

我們先插入一些模擬數(shù)據(jù):

INSERT INTO WEEK_INCOME 
SELECT '星期一',1000
UNION ALL
SELECT '星期二',2000
UNION ALL
SELECT '星期三',3000
UNION ALL
SELECT '星期四',4000
UNION ALL
SELECT '星期五',5000
UNION ALL
SELECT '星期六',6000
UNION ALL
SELECT '星期日',7000

一般我們最經(jīng)常使用的查詢是查詢一周中每天或某幾天的收入,例如查詢周一至周日全部的收入:

SELECT WEEK,INCOME FROM WEEK_INCOME

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

WEEK           INCOME
星期一           1000
星期二           2000
星期三           3000
星期四           4000
星期五           5000
星期六           6000
星期日           7000

但是在一些情況下(往往是某些報(bào)表中),我們希望在一行中顯示周一至周日的收入,這時(shí)候查詢結(jié)果集應(yīng)該是這樣的:

星期一   星期二   星期三   星期四   星期五   星期六   星期日
1000     2000     3000     4000     5000     6000     7000

這種情況下,SQL查詢語句可以這樣寫:

SELECT 
SUM(CASE WEEK WHEN '星期一' THEN INCOME END) AS [星期一],
SUM(CASE WEEK WHEN '星期二' THEN INCOME END) AS [星期二],
SUM(CASE WEEK WHEN '星期三' THEN INCOME END) AS [星期三],
SUM(CASE WEEK WHEN '星期四' THEN INCOME END) AS [星期四],
SUM(CASE WEEK WHEN '星期五' THEN INCOME END) AS [星期五],
SUM(CASE WEEK WHEN '星期六' THEN INCOME END) AS [星期六],
SUM(CASE WEEK WHEN '星期日' THEN INCOME END) AS [星期日]
FROM WEEK_INCOME

但是,在SQL SERVER 2005中提供了更為簡便的方法,這就是"PIVOT"關(guān)系運(yùn)算符。(相反的“列轉(zhuǎn)行”是UNPIVOT),以下是使用PIVOT實(shí)現(xiàn)“行轉(zhuǎn)列”的SQL語句

SELECT [星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]
FROM WEEK_INCOME
PIVOT
(
  SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])
)TBL

請參考MSDN中關(guān)于PIVOT的用法:

http://technet.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx

但是MSDN上的描述太過于規(guī)范嚴(yán)肅,我看了半天還沒弄清楚怎樣使用PIVOT,搞不清楚PIVOT里面的語法的含義。于是又google了很多資料,以及通過上面提到的WEEK_INCOME表例子作了試驗(yàn),最終搞清楚了其用法。在網(wǎng)上有篇博文解釋的很好:http://rely1020.blog.ithome.com.tw/post/1606/39111,基本上我要寫的就是參照該博文,再加上自己一點(diǎn)個(gè)人理解。

要理解PIVOT語法,就是要清楚微軟為什么這樣設(shè)計(jì)PIVOT,但我相信是現(xiàn)實(shí)需求催生設(shè)計(jì)思路,所以歸根到底我們還是要弄清楚什么是“行轉(zhuǎn)列”:

正常情況下的查詢結(jié)果是這樣:

星期一           1000
星期二           2000
星期三           3000
星期四           4000
星期五           5000
星期六           6000
星期日           7000

行轉(zhuǎn)列后是這樣:

星期一   星期二   星期三   星期四   星期五   星期六   星期日
1000    2000    3000    4000    5000    6000    7000

也就是說,行轉(zhuǎn)列后,原來的某個(gè)列的值變做了列名,在這里就是原來WEEK列的值“星期一”,"星期二"..."星期日"邊做了列名,而我們需要做的另一個(gè)工作就是計(jì)算這些列的值(這里的“計(jì)算”其實(shí)就是PIVOT里面的聚合函數(shù)(sum,avg等))

現(xiàn)在結(jié)合注釋來分析一下PIVOT語法(在這之前最好看看我上面提到博文:http://rely1020.blog.ithome.com.tw/post/1606/39111,里面說到的PIVOT語法的三個(gè)步驟挺重要):

SELECT [星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]--這里是PIVOT第三步(選擇行轉(zhuǎn)列后的結(jié)果集的列)這里可以用“*”表示選擇所有列,也可以只選擇某些列(也就是某些天)
FROM WEEK_INCOME --這里是PIVOT第二步驟(準(zhǔn)備原始的查詢結(jié)果,因?yàn)镻IVOT是對一個(gè)原始的查詢結(jié)果集進(jìn)行轉(zhuǎn)換操作,所以先查詢一個(gè)結(jié)果集出來)這里可以是一個(gè)select子查詢,但為子查詢時(shí)候要指定別名,否則語法錯(cuò)誤
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)列后“星期一”這個(gè)列的值當(dāng)然是1500了。后面的for [week] in([星期一],[星期二]...)中 for [week]就是說將week列的值分別轉(zhuǎn)換成一個(gè)個(gè)列,也就是“以值變列”。但是需要轉(zhuǎn)換成列的值有可能有很多,我們只想取其中幾個(gè)值轉(zhuǎn)換成列,那么怎樣取呢?就是在in里面了,比如我此刻只想看工作日的收入,在in里面就只寫“星期一”至“星期五”(注意,in里面是原來week列的值,"以值變列")??偟膩碚f,SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])這句的意思如果直譯出來,就是說:將列[week]值為"星期一","星期二","星期三","星期四","星期五","星期六","星期日"分別轉(zhuǎn)換成列,這些列的值取income的總和。
)TBL--別名一定要寫

以上是我對PIVOT的理解,我盡所能表達(dá)出來。不過話說回來,個(gè)人的理解的方式也不同,就如我開始看了很多篇博文,都沒有搞清楚PIVOT用法。結(jié)果還是硬的通過例子和別人的博文再加上思考才弄懂了,所以如果各位看了本篇之后仍不能理解,那很正常,配合例子再加上自己思考,慢慢的定能理解。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • SQL?Server新特性SequenceNumber用法介紹

    SQL?Server新特性SequenceNumber用法介紹

    這篇文章介紹了SQL?Server新特性SequenceNumber的用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • SQLServer2005 按照日期自動備份的方法

    SQLServer2005 按照日期自動備份的方法

    SQLServer2005如何備份,按照日期自動備份
    2010-07-07
  • SQL Server Parameter Sniffing及其改進(jìn)方法

    SQL Server Parameter Sniffing及其改進(jìn)方法

    這篇文章主要介紹了SQL Server Parameter Sniffing及其改進(jìn)方法,需要的朋友可以參考下
    2017-06-06
  • 必須會的SQL語句(八) 數(shù)據(jù)庫的完整性約束

    必須會的SQL語句(八) 數(shù)據(jù)庫的完整性約束

    這篇文章主要介紹了sqlserver中數(shù)據(jù)庫的完整性約束使用方法,需要的朋友可以參考下
    2015-01-01
  • Mybatis SQL注解使用場景分析

    Mybatis SQL注解使用場景分析

    MyBatis 提供了幾種常用的注解,主要用于簡化 XML 映射文件的編寫,使得 SQL 查詢和操作可以直接在 Java 接口中定義,這篇文章主要介紹了Mybatis SQL注解使用場景,需要的朋友可以參考下
    2024-07-07
  • SQLServer中MERGE語句的使用

    SQLServer中MERGE語句的使用

    MERGE語句用于根據(jù)兩個(gè)表之間的條件來插入、更新或刪除記錄,本文主要介紹了SQLServer中MERGE語句的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • SQLAlchemy案例詳解

    SQLAlchemy案例詳解

    SQLAlchemy?是?Python?SQL?工具包和對象關(guān)系映射器,為應(yīng)用程序開發(fā)人員提供SQL的全部功能和靈活性,這篇文章主要介紹了SQLAlchemy詳解,需要的朋友可以參考下
    2024-04-04
  • MS SQL Server獲取十二個(gè)月份的英文縮寫

    MS SQL Server獲取十二個(gè)月份的英文縮寫

    十二個(gè)月份的英文縮寫,只有五月份是全稱與縮寫一樣,其它月份的縮寫僅是取前三位字母。因此Insus.NET寫成一個(gè)自定義函數(shù)獲取月份名稱縮寫,感興趣的朋友可以了解下
    2013-01-01
  • SQLSERVER?出現(xiàn)死鎖查找方法和解決辦法(推薦)

    SQLSERVER?出現(xiàn)死鎖查找方法和解決辦法(推薦)

    這篇文章主要介紹了SQLSERVER?出現(xiàn)死鎖查找方法和解決辦法(推薦),文中講解了查詢死鎖語句,殺死死鎖的解決方法,需要的朋友可以參考下
    2024-02-02
  • Ubuntu 下安裝SQL Server教程

    Ubuntu 下安裝SQL Server教程

    本文給大家介紹的是如何在Ubuntu系統(tǒng)中安裝微軟剛剛發(fā)布的SqlServer for Linux的預(yù)覽版,有需要的小伙伴可以參考下
    2016-12-12

最新評論