亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍

重溫SQL——行轉列,列轉行
來源:易賢網 閱讀:1923 次 日期:2015-05-04 14:25:38
溫馨提示:易賢網小編為您整理了“重溫SQL——行轉列,列轉行”,方便廣大網友查閱!

行轉列,列轉行是我們在開發過程中經常碰到的問題。行轉列一般通過CASE WHEN 語句來實現,也可以通過 SQL SERVER 2005 新增的運算符PIVOT來實現。用傳統的方法,比較好理解。層次清晰,而且比較習慣。 但是PIVOT 、UNPIVOT提供的語法比一系列復雜的SELECT…CASE 語句中所指定的語法更簡單、更具可讀性。下面我們通過幾個簡單的例子來介紹一下列轉行、行轉列問題。

我們首先先通過一個老生常談的例子,學生成績表(下面簡化了些)來形象了解下行轉列

CREATE TABLE [StudentScores]

(

[UserName] NVARCHAR(20), --學生姓名

[Subject] NVARCHAR(30), --科目

[Score] FLOAT, --成績

)

INSERT INTO [StudentScores] SELECT 'Nick', '語文', 80

INSERT INTO [StudentScores] SELECT 'Nick', '數學', 90

INSERT INTO [StudentScores] SELECT 'Nick', '英語', 70

INSERT INTO [StudentScores] SELECT 'Nick', '生物', 85

INSERT INTO [StudentScores] SELECT 'Kent', '語文', 80

INSERT INTO [StudentScores] SELECT 'Kent', '數學', 90

INSERT INTO [StudentScores] SELECT 'Kent', '英語', 70

INSERT INTO [StudentScores] SELECT 'Kent', '生物', 85

如果我想知道每位學生的每科成績,而且每個學生的全部成績排成一行,這樣方便我查看、統計,導出數據

SELECT

UserName,

MAX(CASE Subject WHEN '語文' THEN Score ELSE 0 END) AS '語文',

MAX(CASE Subject WHEN '數學' THEN Score ELSE 0 END) AS '數學',

MAX(CASE Subject WHEN '英語' THEN Score ELSE 0 END) AS '英語',

MAX(CASE Subject WHEN '生物' THEN Score ELSE 0 END) AS '生物'

FROM dbo.[StudentScores]

GROUP BY UserName

查詢結果如圖所示,這樣我們就能很清楚的了解每位學生所有的成績了

名單

接下來我們來看看第二個小列子。有一個游戲玩家充值表(僅僅為了說明,舉的一個小例子),

CREATE TABLE [Inpours]

(

[ID] INT IDENTITY(1,1),

[UserName] NVARCHAR(20), --游戲玩家

[CreateTime] DATETIME, --充值時間

[PayType] NVARCHAR(20), --充值類型

[Money] DECIMAL, --充值金額

[IsSuccess] BIT, --是否成功 1表示成功, 0表示失敗

CONSTRAINT [PK_Inpours_ID] PRIMARY KEY(ID)

)

INSERT INTO Inpours SELECT '張三', '2010-05-01', '支付寶', 50, 1

INSERT INTO Inpours SELECT '張三', '2010-06-14', '支付寶', 50, 1

INSERT INTO Inpours SELECT '張三', '2010-06-14', '手機短信', 100, 1

INSERT INTO Inpours SELECT '李四', '2010-06-14', '手機短信', 100, 1

INSERT INTO Inpours SELECT '李四', '2010-07-14', '支付寶', 100, 1

INSERT INTO Inpours SELECT '王五', '2010-07-14', '工商銀行卡', 100, 1

INSERT INTO Inpours SELECT '趙六', '2010-07-14', '建設銀行卡', 100, 1

下面來了一個統計數據的需求,要求按日期、支付方式來統計充值金額信息。這也是一個典型的行轉列的例子。我們可以通過下面的腳本來達到目的

代碼

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime,

CASE PayType WHEN '支付寶' THEN SUM(Money) ELSE 0 END AS '支付寶',

CASE PayType WHEN '手機短信' THEN SUM(Money) ELSE 0 END AS '手機短信',

CASE PayType WHEN '工商銀行卡' THEN SUM(Money) ELSE 0 END AS '工商銀行卡',

CASE PayType WHEN '建設銀行卡' THEN SUM(Money) ELSE 0 END AS '建設銀行卡'

FROM Inpours

GROUP BY CreateTime, PayType

如圖所示,我們這樣只是得到了這樣的輸出結果,還需進一步處理,才能得到想要的結果

名單1

SELECT

CreateTime,

ISNULL(SUM([支付寶]) , 0) AS [支付寶] ,

ISNULL(SUM([手機短信]) , 0) AS [手機短信] ,

ISNULL(SUM([工商銀行卡]), 0) AS [工商銀行卡] ,

ISNULL(SUM([建設銀行卡]), 0) AS [建設銀行卡]

FROM

(

SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime,

CASE PayType WHEN '支付寶' THEN SUM(Money) ELSE 0 END AS '支付寶' ,

CASE PayType WHEN '手機短信' THEN SUM(Money) ELSE 0 END AS '手機短信',

CASE PayType WHEN '工商銀行卡' THEN SUM(Money) ELSE 0 END AS '工商銀行卡',

CASE PayType WHEN '建設銀行卡' THEN SUM(Money) ELSE 0 END AS '建設銀行卡'

FROM Inpours

GROUP BY CreateTime, PayType

) T

GROUP BY CreateTime

其實行轉列,關鍵是要理清邏輯,而且對分組(Group by)概念比較清晰。上面兩個列子基本上就是行轉列的類型了。但是有個問題來了,上面是我為了說明弄的一個簡單列子。實際中,可能支付方式特別多,而且邏輯也復雜很多,可能涉及匯率、手續費等等(曾經做個這樣一個),如果支付方式特別多,我們的CASE WHEN 會弄出一大堆,確實比較惱火,而且新增一種支付方式,我們還得修改腳本如果把上面的腳本用動態SQL改寫一下,我們就能輕松解決這個問題

代碼

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->DECLARE @cmdText VARCHAR(8000);

DECLARE @tmpSql VARCHAR(8000);

SET @cmdText = 'SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime,' + CHAR(10);

SELECT @cmdText = @cmdText + ' CASE PayType WHEN ''' + PayType + ''' THEN SUM(Money) ELSE 0 END AS ''' + PayType

+ ''',' + CHAR(10) FROM (SELECT DISTINCT PayType FROM Inpours ) T

SET @cmdText = LEFT(@cmdText, LEN(@cmdText) -2) --注意這里,如果沒有加CHAR(10) 則用LEFT(@cmdText, LEN(@cmdText) -1)

SET @cmdText = @cmdText + ' FROM Inpours GROUP BY CreateTime, PayType ';

SET @tmpSql ='SELECT CreateTime,' + CHAR(10);

SELECT @tmpSql = @tmpSql + ' ISNULL(SUM(' + PayType + '), 0) AS ''' + PayType + ''',' + CHAR(10)

FROM (SELECT DISTINCT PayType FROM Inpours ) T

SET @tmpSql = LEFT(@tmpSql, LEN(@tmpSql) -2) + ' FROM (' + CHAR(10);

SET @cmdText = @tmpSql + @cmdText + ') T GROUP BY CreateTime ';

PRINT @cmdText

EXECUTE (@cmdText);

下面是通過PIVOT來進行行轉列的用法,大家可以對比一下,確實要簡單、更具可讀性(呵呵,習慣的前提下)

代碼

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->SELECT

CreateTime, [支付寶] , [手機短信],

[工商銀行卡] , [建設銀行卡]

FROM

(

SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime,PayType, Money

FROM Inpours

) P

PIVOT (

SUM(Money)

FOR PayType IN

([支付寶], [手機短信], [工商銀行卡], [建設銀行卡])

) AS T

ORDER BY CreateTime

有時可能會出現這樣的錯誤:

消息 325,級別 15,狀態 1,第 9 行

‘PIVOT’ 附近有語法錯誤。您可能需要將當前數據庫的兼容級別設置為更高的值,以啟用此功能。有關存儲過程 sp_dbcmptlevel 的信息,請參見幫助。

這個是因為:對升級到 SQL Server 2005 或更高版本的數據庫使用 PIVOT 和 UNPIVOT 時,必須將數據庫的兼容級別設置為 90 或更高。有關如何設置數據庫兼容級別的信息,請參閱 sp_dbcmptlevel (Transact-SQL)。 例如,只需在執行上面腳本前加上 EXEC sp_dbcmptlevel Test, 90; 就OK了, Test 是所在數據庫的名稱。

下面我們來看看列轉行,主要是通過UNION ALL ,MAX來實現。假如有下面這么一個表

代碼

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->CREATE TABLE ProgrectDetail

(

ProgrectName NVARCHAR(20), --工程名稱

OverseaSupply INT, --海外供應商供給數量

NativeSupply INT, --國內供應商供給數量

SouthSupply INT, --南方供應商供給數量

NorthSupply INT --北方供應商供給數量

)

INSERT INTO ProgrectDetail

SELECT 'A', 100, 200, 50, 50

UNION ALL

SELECT 'B', 200, 300, 150, 150

UNION ALL

SELECT 'C', 159, 400, 20, 320

UNION ALL

SELECT 'D', 250, 30, 15, 15

我們可以通過下面的腳本來實現,查詢結果如下圖所示

代碼

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->SELECT ProgrectName, 'OverseaSupply' AS Supplier,

MAX(OverseaSupply) AS 'SupplyNum'

FROM ProgrectDetail

GROUP BY ProgrectName

UNION ALL

SELECT ProgrectName, 'NativeSupply' AS Supplier,

MAX(NativeSupply) AS 'SupplyNum'

FROM ProgrectDetail

GROUP BY ProgrectName

UNION ALL

SELECT ProgrectName, 'SouthSupply' AS Supplier,

MAX(SouthSupply) AS 'SupplyNum'

FROM ProgrectDetail

GROUP BY ProgrectName

UNION ALL

SELECT ProgrectName, 'NorthSupply' AS Supplier,

MAX(NorthSupply) AS 'SupplyNum'

FROM ProgrectDetail

GROUP BY ProgrectName

名單2

用UNPIVOT 實現如下:

代碼

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->SELECT ProgrectName,Supplier,SupplyNum

FROM

(

SELECT ProgrectName, OverseaSupply, NativeSupply,

SouthSupply, NorthSupply

FROM ProgrectDetail

)T

UNPIVOT

(

SupplyNum FOR Supplier IN

(OverseaSupply, NativeSupply, SouthSupply, NorthSupply )

) P

更多信息請查看IT技術專欄

更多信息請查看數據庫
易賢網手機網站地址:重溫SQL——行轉列,列轉行
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍
国产精品vip| 久久综合网络一区二区| 久久久久久一区| 欧美 日韩 国产 一区| 国产自产在线视频一区| 国产欧美日韩一区二区三区| 久久狠狠婷婷| 狠狠色噜噜狠狠色综合久| 在线日韩电影| 久久久久久久久一区二区| 激情久久久久久| 亚洲欧美日韩精品一区二区| 国产精品v一区二区三区| 国产亚洲毛片| 狠狠色综合网| 欧美伊人影院| 国产偷自视频区视频一区二区| 久久久久91| 国产日韩专区| 亚洲国产日韩欧美| 国产一区亚洲| 欧美久久久久久| 蘑菇福利视频一区播放| av不卡免费看| 激情偷拍久久| 国产综合色一区二区三区| 先锋影音一区二区三区| 日韩视频久久| 亚洲国产专区| 亚洲激情视频| 狠狠爱www人成狠狠爱综合网| 免费久久久一本精品久久区| 亚洲精品免费观看| 欧美日韩a区| 久久久久欧美| 久久看片网站| 欧美一级久久| 欧美亚洲免费| 老司机一区二区三区| 国产偷国产偷亚洲高清97cao| 亚洲高清视频一区| 伊人精品在线| 亚洲日本成人| aa成人免费视频| 国产精品久久亚洲7777| 一本色道婷婷久久欧美| 一区二区三区高清视频在线观看| 亚洲激情一区二区三区| 99re6热在线精品视频播放速度| 激情av一区| 韩日精品在线| 伊人久久婷婷| 国产视频一区免费看| 国产日韩欧美一区二区三区在线观看| 一区二区三区成人精品| 中文有码久久| 久久久久.com| 狠狠久久综合婷婷不卡| 亚洲人成免费| 免费亚洲婷婷| 欧美日韩一区二区三区在线观看免| 久久精品亚洲| 国内在线观看一区二区三区| 精品91久久久久| 国产欧美丝祙| 欧美黄色精品| 亚洲看片一区| 久久亚洲风情| 亚洲激情不卡| 欧美一区精品| 亚洲美女网站| 欧美日韩91| 一区二区精品| 欧美黄色aaaa| 日韩午夜精品| 你懂的一区二区| 亚洲图片在线观看| 欧美亚洲一区| 亚洲激情二区| 老色鬼久久亚洲一区二区| 亚洲大黄网站| 欧美a级在线| 国产精品乱码一区二区三区| 欧美精品九九| 久久精品国产清高在天天线 | 日韩午夜av| 久久久av水蜜桃| 99国内精品| 国产在线精品二区| 美女精品国产| 国产精品乱码一区二区三区| 激情久久久久久| 欧美永久精品| 六月天综合网| 国产麻豆综合| 夜夜爽av福利精品导航| 国模 一区 二区 三区| 美女网站久久| 免费在线观看成人av| 中文网丁香综合网| 最新国产乱人伦偷精品免费网站| 午夜精品av| 久久字幕精品一区| 六月婷婷久久| 久久久夜夜夜| 久久性色av| 老司机精品导航| 久久久久.com| 久久综合久久久| 久久久久九九九| 老司机精品久久| 欧美一区二区三区四区夜夜大片 | 亚洲大胆视频| 午夜视频一区| 欧美私人啪啪vps| 欧美日韩国产高清| 欧美日韩视频一区二区三区| 欧美va天堂在线| 午夜激情一区| 国产精品v日韩精品v欧美精品网站 | 久久久久中文| 可以免费看不卡的av网站| 噜噜噜在线观看免费视频日韩| 国产欧美日本在线| 国产精品夜夜夜一区二区三区尤| 99精品国产在热久久婷婷| 一本色道久久综合亚洲精品不| 一本色道久久综合亚洲精品不| 国产午夜久久| 久久久精品性| 国内精品久久久久久久果冻传媒| 很黄很黄激情成人| 99伊人成综合| 久热综合在线亚洲精品| 欧美日韩在线精品一区二区三区| 国内自拍一区| 国产一区二区高清| 欧美大香线蕉线伊人久久国产精品| 欧美韩国一区| 99国内精品| 香蕉久久国产| 国产综合色一区二区三区| 亚洲久久在线| 午夜视频久久久| 中文精品在线| 欧美日韩精品免费观看| 一本久久综合| 欧美日韩国产综合在线| 99精品视频免费| 欧美有码视频| 一本色道久久综合亚洲精品婷婷 | 在线视频精品| 欧美a级片网站| 亚洲看片免费| 欧美性色综合| 欧美专区一区二区三区| 亚洲视频福利| 久久婷婷丁香| 国产私拍一区| 亚洲国产精品一区在线观看不卡 | 亚洲人成网站在线观看播放| 久久精品欧美| 国产亚洲一级| 91久久中文| 国内自拍视频一区二区三区 | 亚洲精品少妇| 欧美1区2区视频| 国产精品一区二区三区四区五区| 国产一区二区中文字幕免费看| 亚洲一区二区三区四区五区午夜| 精品电影一区| 国产一区二区在线观看免费播放| 裸体一区二区| 免费毛片一区二区三区久久久| 亚洲国产欧美不卡在线观看| 欧美午夜影院| 欧美精品91| 欧美福利网址| 欧美99久久| 欧美成人高清| 老司机精品久久| 久久综合九色99| 老司机精品导航| 老司机午夜精品视频在线观看| 激情欧美一区二区三区| 狠狠色噜噜狠狠狠狠色吗综合| 午夜视频久久久| 欧美日本二区| 狠狠爱www人成狠狠爱综合网| 欧美日韩精品免费观看视一区二区 | 欧美午夜精品理论片a级大开眼界| 午夜一区不卡| 免费永久网站黄欧美| 国产视频一区在线观看一区免费| 日韩香蕉视频| 国产日韩亚洲欧美精品| 在线亚洲美日韩| 国产精品美女| 免费在线成人| 欧美成人一品| 亚洲私拍自拍| 99爱精品视频| 久久av最新网址| 欧美一区二区在线| 狠狠色狠狠色综合日日tαg| 在线成人亚洲| 亚洲综合丁香| 欧美日韩18| 亚洲久久在线| 久久精品五月| 国产在线一区二区三区四区 | 亚洲第一毛片| 国产伦精品一区二区| 久久久久久穴| 亚洲国产婷婷香蕉久久久久久99| aa级大片欧美三级| 久久综合久久久| 亚洲欧洲精品一区二区| 性8sex亚洲区入口| 国产精品a久久久久| 91久久国产自产拍夜夜嗨| 国产农村妇女精品一二区| 久久久久久亚洲精品不卡4k岛国| 国内精品久久久久国产盗摄免费观看完整版 | 久久久久国内| 亚洲国产日韩欧美| 久久精选视频| 99精品99久久久久久宅男| 久久夜色精品| 国产麻豆综合| 在线日韩av| 欧美精品免费观看二区| 亚洲一区在线免费| 伊人狠狠色j香婷婷综合| 久久久一二三| 亚洲一区精品视频| 99热精品在线| 一区在线视频| 国产精品国产三级欧美二区| 午夜一级在线看亚洲| 亚洲韩日在线| 韩日成人av| 亚洲欧美一区二区原创| 男人的天堂成人在线| 99精品视频免费观看| 国产精品久久| 女人天堂亚洲aⅴ在线观看| 国产美女精品| 国产精品毛片| 在线视频日韩| 一区二区三区成人精品| 亚洲国产1区| 在线观看一区欧美| 精品成人免费| 伊人狠狠色j香婷婷综合| 欧美日韩国产一区精品一区| 免费亚洲视频| 亚洲欧美日韩另类精品一区二区三区| 亚洲国产精品久久久久久女王 | 亚洲高清在线观看一区| 欧美高清日韩| 欧美区一区二| 国产精品大片免费观看| 欧美日一区二区三区在线观看国产免| 久久日韩精品| 欧美日韩精品免费观看| 欧美日韩精品| 一区在线视频观看| 亚洲经典在线| 国产精品一区二区你懂得| 国产精品伊人日日| 久久国产精品久久精品国产| 久久久久se| 欧美日韩精品免费观看| 欧美激情视频一区二区三区在线播放| 欧美国产先锋| 在线国产日韩| 亚洲综合不卡| 欧美精品aa| 亚洲激情偷拍| 噜噜噜躁狠狠躁狠狠精品视频 | 欧美区日韩区| 精品电影一区| 国产一区二区三区久久| 欧美中文字幕| 国产精品国码视频| 日韩午夜免费| 久久亚洲一区| 亚洲黄色高清| 麻豆精品网站| 亚洲高清av| 翔田千里一区二区| 韩国精品一区二区三区| 一区二区三区导航| 欧美福利一区| 国产区二精品视| 欧美日韩影院| 9色精品在线| 欧美精品一区二区三区在线看午夜| 亚洲午夜91| 久久久久一区| 国产区日韩欧美| 欧美日韩国产不卡在线看| 亚洲精品欧美| 欧美日韩在线高清| 免费欧美日韩| 一区二区毛片| 亚洲午夜精品久久久久久浪潮| 亚洲永久视频| 亚洲日本精品国产第一区| 久久av最新网址| 在线午夜精品| 海角社区69精品视频| 六月婷婷久久| 亚洲一区免费| 一区二区三区四区国产| 欧美激情一区| 久久精品亚洲| 性一交一乱一区二区洋洋av| 亚洲黄色一区| 国产综合18久久久久久| 久久亚洲国产精品一区二区| 中日韩视频在线观看| 伊人久久综合| 激情欧美一区二区三区| 欧美精品亚洲| 欧美日韩ab| 欧美成人69av| 老司机精品福利视频| 鲁鲁狠狠狠7777一区二区| 国产精品亚洲一区| 一区二区动漫| 在线一区日本视频| 99视频在线精品国自产拍免费观看| 国产精品国产精品| 好看的av在线不卡观看| 国产精品a级| 亚洲午夜黄色| 一区二区在线不卡| 亚洲国产午夜| 一本色道久久综合一区| 一级成人国产| 亚洲一区二区三区精品动漫| 国产女优一区| 久久人人九九| 欧美午夜电影在线观看| 欧美日韩国产成人精品| 欧美日韩国产精品一卡| 狠狠色综合色区| 在线看无码的免费网站| 亚洲精品无人区| 亚洲最新在线| 久久精品三级| 国产精品国产精品| 亚洲日本免费| 亚欧美中日韩视频| 欧美一区二视频在线免费观看| 午夜日韩电影| 亚洲伦理精品| 蜜桃久久av| 狠狠久久婷婷| 国产欧美一区二区三区另类精品| 亚洲欧美日韩精品在线| 玖玖玖国产精品| 激情久久五月| 亚洲一区成人| 国产一区视频观看| 一区二区国产精品| 久热精品视频| 亚洲日韩视频| 久久亚洲风情| 亚洲精品在线二区| 久久久国产精品一区二区中文| 黄色成人av网站| 亚洲综合另类| 国产一区亚洲| 久久国产精品一区二区三区| 好吊色欧美一区二区三区四区| 国产一区二区你懂的| 欧美婷婷久久| 久久大香伊蕉在人线观看热2| 欧美日韩调教| 美女国产一区| 99pao成人国产永久免费视频| 久久精品观看| 国产欧美一区二区三区另类精品 | 国产日韩综合| 国语精品中文字幕| 香蕉成人久久| 日韩一级网站| 国产精品黄色| 欧美一区1区三区3区公司 | 欧美成人综合| 国产精品久久国产三级国电话系列| 欧美在线亚洲| 久久国产日本精品| 国产精品免费一区二区三区观看| 国产综合色产| 欧美日韩网站| 欧美精品一卡|