亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server 動態行轉列(參數化表名、分組列、行轉列字段、字段值)

2024-08-31 00:54:58
字體:
來源:轉載
供稿:網友
SQL Server 動態行轉列(參數化表名、分組列、行轉列字段、字段值) 一.本文所涉及的內容(Contents)
  1. 本文所涉及的內容(Contents)
  2. 背景(Contexts)
  3. 實現代碼(SQL Codes)
    1. 方法一:使用拼接SQL,靜態列字段;
    2. 方法二:使用拼接SQL,動態列字段;
    3. 方法三:使用PIVOT關系運算符,靜態列字段;
    4. 方法四:使用PIVOT關系運算符,動態列字段;
    5. 擴展閱讀一:參數化表名、分組列、行轉列字段、字段值;
    6. 擴展閱讀二:在前面的基礎上加入條件過濾;
  4. 參考文獻(References)
二.背景(Contexts)

  其實行轉列并不是一個什么新鮮的話題了,甚至已經被大家說到爛了,網上的很多例子多多少少都有些問題,所以我希望能讓大家快速的看到執行的效 果,所以在動態列的基礎上再把表、分組字段、行轉列字段、值這四個行轉列固定需要的值變成真正意義的參數化,大家只需要根據自己的環境,設置參數值,馬上 就能看到效果了(可以直接跳轉至:“參數化動態PIVOT行轉列”查看具體的腳本代碼)。行轉列的效果圖如圖1所示:

wps_clip_image-32543

(圖1:行轉列效果圖)

三.實現代碼(SQL Codes)

(一) 首先我們先創建一個測試表,往里面插入測試數據,返回表記錄如圖2所示:

復制代碼
--創建測試表IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestRows2Columns]') AND type in (N'U'))DROP TABLE [dbo].[TestRows2Columns]GOCREATE TABLE [dbo].[TestRows2Columns](    [Id] [int] IDENTITY(1,1) NOT NULL,    [UserName] [nvarchar](50) NULL,    [Subject] [nvarchar](50) NULL,    [Source] [numeric](18, 0) NULL) ON [PRIMARY]GO--插入測試數據INSERT INTO [TestRows2Columns] ([UserName],[Subject],[Source])     SELECT N'張三',N'語文',60  UNION ALL    SELECT N'李四',N'數學',70  UNION ALL    SELECT N'王五',N'英語',80  UNION ALL    SELECT N'王五',N'數學',75  UNION ALL    SELECT N'王五',N'語文',57  UNION ALL    SELECT N'李四',N'語文',80  UNION ALL    SELECT N'張三',N'英語',100GOSELECT * FROM [TestRows2Columns]
復制代碼

wps_clip_image-8842

(圖2:樣本數據)

(二) 先以靜態的方式實現行轉列,效果如圖3所示:

復制代碼
--1:靜態拼接行轉列SELECT [UserName],SUM(CASE [Subject] WHEN '數學' THEN [Source] ELSE 0 END) AS '[數學]',SUM(CASE [Subject] WHEN '英語' THEN [Source] ELSE 0 END) AS '[英語]',SUM(CASE [Subject] WHEN '語文' THEN [Source] ELSE 0 END) AS '[語文]'     FROM [TestRows2Columns]GROUP BY [UserName]GO
復制代碼

wps_clip_image-14456

(圖3:樣本數據)

(三) 接著以動態的方式實現行轉列,這是使用拼接SQL的方式實現的,所以它適用于SQL Server 2000以上的數據庫版本,執行腳本返回的結果如圖2所示;

復制代碼
--2:動態拼接行轉列DECLARE @sql VARCHAR(8000)SET @sql = 'SELECT [UserName],'   SELECT @sql = @sql + 'SUM(CASE [Subject] WHEN '''+[Subject]+''' THEN [Source] ELSE 0 END) AS '''+QUOTENAME([Subject])+''','   FROM (SELECT DISTINCT [Subject] FROM [TestRows2Columns]) AS a     SELECT @sql = LEFT(@sql,LEN(@sql)-1) + ' FROM [TestRows2Columns] GROUP BY [UserName]'   PRINT(@sql)EXEC(@sql)GO
復制代碼

(四) 在SQL Server 2005之后有了一個專門的PIVOT 和 UNPIVOT 關系運算符做行列之間的轉換,下面是靜態的方式實現的,實現效果如圖4所示:

復制代碼
--3:靜態PIVOT行轉列SELECT  *FROM    ( SELECT    [UserName] ,                    [Subject] ,                    [Source]          FROM      [TestRows2Columns]        ) p PIVOT( SUM([Source]) FOR [Subject] IN ( [數學],[英語],[語文] ) ) AS pvtORDER BY pvt.[UserName];GO
復制代碼

wps_clip_image-23886

(圖4)

(五) 把上面靜態的SQL基礎上進行修改,這樣就不用理會記錄里面存儲了什么,需要轉成什么列名的問題了,腳本如下,效果如圖4所示:

復制代碼
--4:動態PIVOT行轉列DECLARE @sql_str VARCHAR(8000)DECLARE @sql_col VARCHAR(8000)SELECT @sql_col = ISNULL(@sql_col + ',','') + QUOTENAME([Subject]) FROM [TestRows2Columns] GROUP BY [Subject]SET @sql_str = 'SELECT * FROM (    SELECT [UserName],[Subject],[Source] FROM [TestRows2Columns]) p PIVOT     (SUM([Source]) FOR [Subject] IN ( '+ @sql_col +') ) AS pvt ORDER BY pvt.[UserName]'PRINT (@sql_str)EXEC (@sql_str)
復制代碼

(六) 也許很多人到了上面一步就夠了,但是你會發現,當別人拿到你的代碼,需要不斷的修改成他自己環境中表名、分組列、行轉列字段、字段值這幾個參數,邏輯如圖5所示,所以,我繼續對上面的腳本進行修改,你只要設置自己的參數就可以實現行轉列了,效果如圖4所示:

復制代碼
--5:參數化動態PIVOT行轉列-- =============================================-- Author:        <聽風吹雨>-- Create date: <2014.05.26>-- Description:    <參數化動態PIVOT行轉列>-- Blog:        <http://www.cnblogs.com/gaizai/>-- =============================================DECLARE @sql_str NVARCHAR(MAX)DECLARE @sql_col NVARCHAR(MAX)DECLARE @tableName SYSNAME --行轉列表DECLARE @groupColumn SYSNAME --分組字段DECLARE @row2column SYSNAME --行變列的字段DECLARE @row2columnValue SYSNAME --行變列值的字段SET @tableName = 'TestRows2Columns'SET @groupColumn = 'UserName'SET @row2column = 'Subject'SET @row2columnValue = 'Source'--從行數據中獲取可能存在的列SET @sql_str = N'SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])     FROM ['+@tableName+'] GROUP BY ['+@row2column+']'--PRINT @sql_strEXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT--PRINT @sql_colSET @sql_str = N'SELECT * FROM (    SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']) p PIVOT     (SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt ORDER BY pvt.['+@groupColumn+']'--PRINT (@sql_str)EXEC (@sql_str)
復制代碼

wps_clip_image-17757

(圖5)

(七) 在實際的運用中,我經常遇到需要對基礎表的數據進行篩選后再進行行轉列,那么下面的腳本將滿足你這個需求,效果如圖6所示:

復制代碼
--6:帶條件查詢的參數化動態PIVOT行轉列-- =============================================-- Author:        <聽風吹雨>-- Create date: <2014.05.26>-- Description:    <參數化動態PIVOT行轉列,帶條件查詢的參數化動態PIVOT行轉列>-- Blog:        <http://www.cnblogs.com/gaizai/>-- =============================================DECLARE @sql_str NVARCHAR(MAX)DECLARE @sql_col NVARCHAR(MAX)DECLARE @sql_where NVARCHAR(MAX)DECLARE @tableName SYSNAME --行轉列表DECLARE @groupColumn SYSNAME --分組字段DECLARE @row2column SYSNAME --行變列的字段DECLARE @row2columnValue SYSNAME --行變列值的字段SET @tableName = 'TestRows2Columns'SET @groupColumn = 'UserName'SET @row2column = 'Subject'SET @row2columnValue = 'Source'SET @sql_where = 'WHERE UserName = ''王五'''--從行數據中獲取可能存在的列SET @sql_str = N'SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])     FROM ['+@tableName+'] '+@sql_where+' GROUP BY ['+@row2column+']'--PRINT @sql_strEXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT--PRINT @sql_colSET @sql_str = N'SELECT * FROM (    SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']'+@sql_where+') p PIVOT     (SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt ORDER BY pvt.['+@grou
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产婷婷97碰碰久久人人蜜臀| 亚洲精品综合精品自拍| 久久99久久99精品免观看粉嫩| 中文字幕日韩在线观看| 久久久久久91| 亚洲国产精品久久久久| 亚洲最新av在线| 欧美在线亚洲在线| 欧美精品电影在线| 久久久精品美女| 久久国产精品久久久久久久久久| 色偷偷噜噜噜亚洲男人的天堂| 久久精品免费播放| 热99在线视频| 亚洲bt天天射| 久久视频免费观看| 精品亚洲永久免费精品| 日韩欧美有码在线| 欧美激情中文字幕乱码免费| 久久频这里精品99香蕉| 91po在线观看91精品国产性色| 成人性生交xxxxx网站| 黄色成人在线播放| 欧美人交a欧美精品| 国产精品99久久久久久久久久久久| 亚洲女人被黑人巨大进入al| 国产丝袜精品视频| 亚洲精美色品网站| 26uuu国产精品视频| 日韩在线视频观看正片免费网站| 国产精品一区二区三区久久| 黑人与娇小精品av专区| 久久久久久久久电影| 日韩欧美999| 国产成人精品视| 国产精品狼人色视频一区| 91国自产精品中文字幕亚洲| 伊人久久久久久久久久| 久久大大胆人体| 性欧美在线看片a免费观看| 欧美日韩高清在线观看| 91精品国产色综合久久不卡98口| 日韩国产欧美精品一区二区三区| 成人欧美一区二区三区在线湿哒哒| 久久久久久久久久久亚洲| 欧美日本黄视频| 大桥未久av一区二区三区| 在线播放日韩av| 日韩第一页在线| 亚洲精品视频二区| 亚洲人精选亚洲人成在线| 欧美老少做受xxxx高潮| 亚洲成人久久网| 亚洲国产欧美日韩精品| 欧美又大粗又爽又黄大片视频| 欧美高清videos高潮hd| 欧美风情在线观看| 4444欧美成人kkkk| 伊人久久久久久久久久| 日韩av大片在线| 欧美日韩在线视频观看| 国产欧美最新羞羞视频在线观看| 欧洲午夜精品久久久| 国产亚洲欧美日韩精品| 久久香蕉精品香蕉| 亚洲精品一区二区在线| 久久久欧美精品| 91色在线视频| 亚洲一区二区福利| 亚洲影院色无极综合| 色综合男人天堂| 欧美人在线视频| 日韩人体视频一二区| 精品一区二区三区四区| 欧美猛男性生活免费| 日本久久久a级免费| 亚洲美女中文字幕| 亚洲专区国产精品| 国产亚洲欧美一区| 国产专区欧美专区| 欧美丰满少妇xxxxx做受| 欧美大成色www永久网站婷| 九九热精品视频| 欧美亚州一区二区三区| 亚洲性猛交xxxxwww| 91久久久亚洲精品| 国产成人在线播放| 一本色道久久88精品综合| 97婷婷大伊香蕉精品视频| 欧美xxxx18性欧美| 日韩精品免费综合视频在线播放| 国产精品黄色影片导航在线观看| 国产精品网址在线| 国产日韩在线免费| 国产日韩欧美中文在线播放| 亚洲区一区二区| 亚洲性无码av在线| 久久视频国产精品免费视频在线| 日韩电影免费在线观看| 色综合久久88色综合天天看泰| www.日韩不卡电影av| 国产精品亚洲一区二区三区| 奇米一区二区三区四区久久| 久久久av亚洲男天堂| 九九综合九九综合| 国产精品丝袜久久久久久高清| 欧美另类69精品久久久久9999| 日韩毛片中文字幕| 日韩欧美中文字幕在线观看| 国产精品影院在线观看| 国产午夜精品免费一区二区三区| 欧美精品久久久久久久久久| 国产精品欧美激情| 91精品视频在线看| 欧美日本啪啪无遮挡网站| 日韩美女在线播放| 久久久午夜视频| 日韩av免费在线观看| 亚洲精品久久7777777| 热re99久久精品国产66热| 亚洲专区国产精品| 亚洲天堂久久av| 日韩精品高清视频| 亚洲国产日韩精品在线| 亚洲第一精品夜夜躁人人爽| 精品国产区一区二区三区在线观看| 91最新在线免费观看| xxxx欧美18另类的高清| 91精品久久久久久久久中文字幕| 亚洲精品丝袜日韩| 亚洲欧美综合区自拍另类| 日韩免费在线观看视频| 国产精品欧美激情在线播放| 精品精品国产国产自在线| 日韩在线视频中文字幕| 亚洲999一在线观看www| 亚洲色图35p| 久久精品影视伊人网| 国产亚洲成av人片在线观看桃| 久久久精品亚洲| 欧美—级a级欧美特级ar全黄| 精品久久久国产精品999| 日韩av电影免费观看高清| 久久天天躁狠狠躁夜夜爽蜜月| 尤物99国产成人精品视频| 国产精品亚洲视频在线观看| 日韩成人中文电影| 九九精品视频在线| 综合网中文字幕| 亚洲精品国偷自产在线99热| 日本精品性网站在线观看| 最近2019中文免费高清视频观看www99| 欧美视频在线观看 亚洲欧| 欧美精品九九久久| 亚洲精品资源在线| 91在线观看免费高清完整版在线观看| 国产精品第2页| 国产一区av在线| 久久精品中文字幕一区| 久久天天躁狠狠躁夜夜躁2014| 国产亚洲欧美日韩一区二区| 亚洲欧美日本精品| 国产精品一区二区在线| 久久久伊人欧美|