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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

行转列:SQL SERVER PIVOT与用法解释

發布時間:2025/3/20 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 行转列:SQL SERVER PIVOT与用法解释 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在數據庫操作中,有些時候我們遇到需要實現“行轉列”的需求,例如一下的表為某店鋪的一周收入情況表:

WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIMAL)

我們先插入一些模擬數據:

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

?

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

SELECT WEEK,INCOME FROM WEEK_INCOME

得到如下的查詢結果集:

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

?

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

星期一???星期二???星期三???星期四???星期五???星期六???星期日
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"關系運算符。(相反的“列轉行”是UNPIVOT),以下是使用PIVOT實現“行轉列”的SQL語句

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

?

?

請參考MSDN中關于PIVOT的用法:

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

?

但是MSDN上的描述太過于規范嚴肅,我看了半天還沒弄清楚怎樣使用PIVOT,搞不清楚PIVOT里面的語法的含義。于是又google了很多資料,以及通過上面提到的WEEK_INCOME表例子作了試驗,最終搞清楚了其用法。在網上有篇博文解釋的很好:T-SQL PIVOT語法剖析與實戰,基本上我要寫的就是參照該博文,再加上自己一點個人理解。

要理解PIVOT語法,就是要清楚微軟為什么這樣設計PIVOT,但我相信是現實需求催生設計思路,所以歸根到底我們還是要弄清楚什么是“行轉列”:

正常情況下的查詢結果是這樣:

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

行轉列后是這樣:

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

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

現在結合注釋來分析一下PIVOT語法(在這之前最好看看我上面提到博文:T-SQL PIVOT語法剖析與實戰,里面說到的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列的值,"以值變列")。總的來說,SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])這句的意思如果直譯出來,就是說:將列[week]值為"星期一","星期二","星期三","星期四","星期五","星期六","星期日"分別轉換成列,這些列的值取income的總和。 )TBL--別名一定要寫

?

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

總結

以上是生活随笔為你收集整理的行转列:SQL SERVER PIVOT与用法解释的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 影音先锋中文字幕第一页 | 日韩精品在线观看网站 | 欧美黑人性受xxxx精品 | 欧美日韩一区二区中文字幕 | 另类激情亚洲 | 亚色91| 99re只有精品 | 久操免费视频 | 国产精选视频在线观看 | 99视频在线精品 | 日韩av视屏 | 夜夜爽妓女8888视频免费观看 | 国产精品1区2区3区 在线看黄的网站 | 一本一道av | 中国黄色录像 | 少妇高潮av久久久久久 | 天天av天天操 | 久久久视 | 熟女丝袜一区 | 久久国产人妻一区二区免色戒电影 | 裸体喂奶一级裸片 | 免费日韩成人 | 欧美日韩久久精品 | 神马一区二区三区 | 亚洲av成人无码网天堂 | 人妻av一区二区 | 精品国产一区二区三区在线 | 欧美激情综合五月色丁香 | 中文字幕精品在线视频 | 男男gay羞辱feet贱奴vk | 成人小视频免费在线观看 | 高清在线一区 | 日美av| 中文字幕伦理 | 亚洲AV无码精品久久一区二区 | 国产一级在线观看视频 | 亚洲AV成人无码久久精品同性 | 欧美日韩三级在线观看 | 91视频看看 | 自拍1区| 毛片一级视频 | 欧美黑人巨大xxx极品 | 欧美少妇诱惑 | 天天躁夜夜躁av天天爽 | 欧美一级性 | av黄色大片 | 秋霞福利网 | 日韩二级 | 日韩男女视频 | 日韩色在线| av大片网| 精品视频一二区 | 日韩福利视频网 | 老女人丨91丨九色 | 91啦丨九色丨刺激 | 国产欧美日韩综合 | 青青草原成人 | 日韩欧美一区二区三区在线 | 亚洲一级视频在线观看 | 一区在线免费 | 久久夜色精品国产欧美乱极品 | 国产欧美视频一区 | 你懂的在线观看网址 | 国产精品va无码一区二区三区 | 亚洲情涩| 成人靠逼视频 | 嫩草影院av | free性欧美69巨大 | 青娱乐福利视频 | 色片免费观看 | 国产aⅴ精品一区二区三区久久 | 久久色网 | 91传媒理伦片在线观看 | 中文字幕一区二区三区人妻四季 | 国产午夜手机精彩视频 | 嫩草嫩草嫩草 | 久久久999国产 | 日韩一区二区三区四区五区 | 一级黄色免费大片 | 精产国品一二三区 | 毛片无限看| 中文字幕在线二区 | 黄色片网站国产 | 日本久久网| 99国产成人精品 | 久久7777 | 国产青青操 | 久久成人18免费观看 | 国产做爰xxxⅹ高潮视频12p | 欧美精品国产动漫 | 在线无遮挡 | 久久只有精品 | 97影视 | 欧美涩涩涩 | 香蕉国产在线视频 | 日韩黄色一级视频 | 久久久999 | 激情91| 国产在线操 |