中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

重溫SQL——行轉列,列轉行
來源:易賢網 閱讀:1789 次 日期: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——行轉列,列轉行
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲人在线视频| 欧美精品一区二| 亚洲精品国产精品国产自| 狠狠色丁香婷综合久久| 国产精品一区二区三区久久| 国产精品成人在线| 国产一区二区三区久久 | 国产日韩欧美视频| 国产欧美精品日韩精品| 国产精品久久久久久久浪潮网站 | 亚洲综合色丁香婷婷六月图片| 亚洲激情在线播放| 亚洲欧美日韩国产一区二区| 午夜精品久久久久久久| 久久漫画官网| 欧美freesex交免费视频| 国产精品日日做人人爱| 亚洲国产婷婷| 亚洲一区二区三区免费观看 | 欧美自拍偷拍午夜视频| 欧美波霸影院| 欧美激情国产精品| 国产精品丝袜白浆摸在线| 一区二区三区在线视频播放| 亚洲二区在线视频| 久久久蜜桃精品| 国产精品免费一区二区三区在线观看 | 国内外成人在线视频| 亚洲最新中文字幕| 欧美另类高清视频在线| 99亚洲精品| 欧美激情精品久久久六区热门 | 国产精品午夜电影| 国产精品中文字幕欧美| 欧美国产日本| 国内精品免费午夜毛片| 欧美午夜在线观看| 欧美三区美女| 亚洲一区www| 国产精品视频网站| 欧美一区二区三区视频在线观看 | 久久久www免费人成黑人精品 | 亚洲视频免费在线| 国产麻豆综合| 欧美一区日本一区韩国一区| 国产日韩欧美亚洲一区| 欧美专区日韩视频| 黄色日韩网站视频| 欧美大胆a视频| 一本色道久久综合亚洲精品小说| 欧美电影免费观看高清完整版| 亚洲精品一品区二品区三品区| 欧美激情中文字幕在线| 午夜免费日韩视频| 亚洲高清二区| 欧美午夜宅男影院在线观看| 激情亚洲网站| 欧美图区在线视频| 久久久精品日韩欧美| 亚洲男人的天堂在线| 国产亚洲欧美激情| 欧美人与禽猛交乱配| 亚洲在线播放| 91久久精品一区二区别| 欧美mv日韩mv国产网站| 亚洲精品日韩欧美| 久久一区二区视频| 亚洲高清一二三区| 欧美日韩国产综合久久| 老司机精品视频一区二区三区| 黄色小说综合网站| 欧美久久九九| 国产精品羞羞答答xxdd| 久久香蕉国产线看观看网| 亚洲午夜电影| 亚洲精品欧美激情| 亚洲二区精品| 一区精品在线| 一区二区在线看| 国产午夜亚洲精品不卡| 性色一区二区| 午夜精品久久久久久久99黑人| 在线综合视频| 午夜精品在线看| 久久久噜噜噜久久久| 另类综合日韩欧美亚洲| 亚洲午夜精品网| 艳妇臀荡乳欲伦亚洲一区| 伊大人香蕉综合8在线视| 欧美三日本三级少妇三99| 麻豆久久精品| 免费成人黄色片| 欧美成人一区二区三区| 欧美国产大片| 欧美日韩大片| 欧美午夜宅男影院在线观看| 国产精品久久久久久久久免费樱桃 | 日韩亚洲欧美在线观看| 亚洲精品资源美女情侣酒店| 欧美日韩激情网| 国产三级精品三级| 国内揄拍国内精品少妇国语| 国产视频欧美| 91久久极品少妇xxxxⅹ软件| 亚洲免费成人av电影| 亚洲免费在线播放| 亚洲综合丁香| 免费亚洲电影在线| 欧美日韩视频专区在线播放 | 米奇777在线欧美播放| 欧美国产精品久久| 国产精品国产三级国产aⅴ浪潮| 国产精品久久久久久妇女6080| 国产亚洲欧美另类一区二区三区| 欧美日韩在线观看视频| 国产在线视频欧美| 亚洲免费大片| 久热爱精品视频线路一| 欧美三日本三级少妇三2023| 狠狠狠色丁香婷婷综合激情| 一本大道久久a久久综合婷婷| 久久久噜久噜久久综合| 国产精品久久网站| 亚洲国产精品综合| 亚洲欧美日韩综合一区| 老司机精品视频网站| 国产亚洲精品aa| 99riav国产精品| 亚洲人体1000| 久久香蕉国产线看观看av| 国产欧美精品在线播放| 亚洲调教视频在线观看| 欧美国产日本| 国产精品久久国产精品99gif| 亚洲三级免费电影| 蜜桃av一区| 亚洲高清一区二| 欧美福利电影在线观看| 亚洲精品九九| 欧美啪啪成人vr| 在线视频欧美日韩精品| 欧美日韩一区二区视频在线| 亚洲精品乱码久久久久久按摩观 | 国产午夜精品理论片a级探花 | 久久综合九色欧美综合狠狠| 国产精品久久久一本精品| 亚洲男女毛片无遮挡| 国产美女搞久久| 欧美在线亚洲综合一区| 国产欧美一区二区精品仙草咪 | 美女主播一区| 亚洲人成高清| 国产精品久线观看视频| 久久成人资源| 亚洲精品一区在线| 国产精品一二一区| 一区二区激情| 黄色精品在线看| 欧美日韩国产成人高清视频| 亚洲视频在线免费观看| 国产精品亚洲综合| 欧美h视频在线| 亚洲制服少妇| 在线免费高清一区二区三区| 欧美日韩的一区二区| 久久―日本道色综合久久| 中文精品一区二区三区| 一区二区在线免费观看| 国产精品欧美日韩| 欧美激情在线有限公司| 久久久国产亚洲精品| 亚洲一区二区三区中文字幕在线| 曰韩精品一区二区| 国产麻豆精品theporn| 欧美午夜宅男影院| 欧美日韩在线三级| 欧美高清在线观看| 裸体素人女欧美日韩| 欧美视频一区二区| 久久精品国产免费看久久精品| 日韩五码在线| 欧美日韩在线亚洲一区蜜芽| 久久综合影视| 美女免费视频一区| 久久久蜜桃精品| 国产精品任我爽爆在线播放| 另类av一区二区| 久久精品一区二区三区中文字幕| 一本久久a久久免费精品不卡| 亚洲激情社区| 亚洲美女网站| 这里只有精品视频在线| 一区二区高清| 亚洲视频免费观看| 亚洲一区二区在线免费观看视频| 一区电影在线观看| 亚洲欧美999| 久久在线播放| 欧美成人一区二免费视频软件| 欧美福利视频|