日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

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

SQL行轉列和列轉行代碼詳解

2024-08-31 01:05:12
字體:
來源:轉載
供稿:網友

行列互轉,是一個經常遇到的需求。實現的方法,有case when方式和2005之后的內置pivot和unpivot方法來實現。
在讀了技術內幕那一節后,雖說這些解決方案早就用過了,卻沒有系統性的認識和總結過。為了加深認識,再總結一次。
行列互轉,可以分為靜態互轉,即事先就知道要處理多少行(列);動態互轉,事先不知道處理多少行(列)。

--創建測試環境USE tempdb;GOIF OBJECT_ID('dbo.Orders') IS NOT NULL DROP TABLE dbo.Orders;GOCREATE TABLE dbo.Orders( orderid  int    NOT NULL PRIMARY KEY NONCLUSTERED, orderdate datetime  NOT NULL, empid   int    NOT NULL, custid  varchar(5) NOT NULL, qty    int    NOT NULL);CREATE UNIQUE CLUSTERED INDEX idx_orderdate_orderid ON dbo.Orders(orderdate, orderid);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty) VALUES(30001, '20020802', 3, 'A', 10);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty) VALUES(10001, '20021224', 1, 'A', 12);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty) VALUES(10005, '20021224', 1, 'B', 20);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty) VALUES(40001, '20030109', 4, 'A', 40);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty) VALUES(10006, '20030118', 1, 'C', 14);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty) VALUES(20001, '20030212', 2, 'B', 12);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty) VALUES(40005, '20040212', 4, 'A', 10);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty) VALUES(20002, '20040216', 2, 'C', 20);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty) VALUES(30003, '20040418', 3, 'B', 15);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty) VALUES(30004, '20020418', 3, 'C', 22);INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty) VALUES(30007, '20020907', 3, 'D', 30);GO

行轉列-靜態方案:

--行轉列的靜態方案一:CASE WHEN,兼容sql2000select custid,sum(case when YEAR(orderdate)=2002 then qty end) as [2002],sum(case when YEAR(orderdate)=2003 then qty end) as [2003],sum(case when YEAR(orderdate)=2004 then qty end) as [2004]from ordersgroup by custid;GO--行轉列的靜態方案二:PIVOT,sql2005及以后版本select *from (select custid,YEAR(orderdate) as years,qty from orders) as ordpivot(sum(qty) for years in([2002],[2003],[2004]))as pGO

行轉列-動態方案:加入了xml處理和SQL注入預防判斷

--既然是用到了動態SQL,就有一個老話題:SQL注入。建一個注入性字符的判斷函數。CREATE FUNCTION [dbo].[fn_CheckSQLInjection]( @Col nvarchar(4000))RETURNS BIT --如果存在可能的注入字符返回true,反之返回falseASBEGINDECLARE @result bit; IF    UPPER(@Col) LIKE UPPER(N'%0x%') OR UPPER(@Col) LIKE UPPER(N'%;%') OR UPPER(@Col) LIKE UPPER(N'%''%') OR UPPER(@Col) LIKE UPPER(N'%--%') OR UPPER(@Col) LIKE UPPER(N'%/*%*/%') OR UPPER(@Col) LIKE UPPER(N'%EXEC%') OR UPPER(@Col) LIKE UPPER(N'%xp_%') OR UPPER(@Col) LIKE UPPER(N'%sp_%') OR UPPER(@Col) LIKE UPPER(N'%SELECT%') OR UPPER(@Col) LIKE UPPER(N'%INSERT%') OR UPPER(@Col) LIKE UPPER(N'%UPDATE%') OR UPPER(@Col) LIKE UPPER(N'%DELETE%') OR UPPER(@Col) LIKE UPPER(N'%TRUNCATE%') OR UPPER(@Col) LIKE UPPER(N'%CREATE%') OR UPPER(@Col) LIKE UPPER(N'%ALTER%') OR UPPER(@Col) LIKE UPPER(N'%DROP%') SET @result=1 ELSE SET @result=0 return @resultENDGO--行轉列的動態方案一:CASE WHEN,兼容sql2000DECLARE @T TABLE (years INT NOT NULL PRIMARY KEY);INSERT INTO @T SELECT DISTINCT YEAR(orderdate) from orders;DECLARE @Y INT;SET @Y=(SELECT MIN(years) from @T);DECLARE @SQL NVARCHAR(4000)=N'';WHILE @Y IS NOT NULLBEGIN SET @SQL=@SQL+N',sum(case when YEAR(orderdate)='+CAST(@Y AS NVARCHAR(4)) +N' then qty end) as '+QUOTENAME(@Y); SET @Y=(SELECT MIN(years) from @T where years>@Y);ENDIF dbo.fn_CheckSQLInjection(@SQL)=0SET @SQL=N'SELECT custid'+@SQL+N' FROM orders group by custid'PRINT @SQLEXEC sp_executesql @SQLGO--行轉列的動態方案二:PIVOT,sql2005及以后版本DECLARE @T TABLE (years INT NOT NULL PRIMARY KEY);INSERT INTO @T SELECT DISTINCT YEAR(orderdate) from orders;DECLARE @Y INT;SET @Y=(SELECT MIN(years) from @T);DECLARE @SQL NVARCHAR(4000)=N'';  --這里使用了xml處理來處理類組字符串SET @SQL=STUFF((SELECT N','+QUOTENAME(years) FROM @T FOR XML PATH('')),1,1,N'');IF dbo.fn_CheckSQLInjection(@SQL)=0SET @SQL=N'select * from (select DISTINCT custid,YEAR(orderdate) as years,qty from orders) as ordpivot(sum(qty) for years in('+@SQL+N'))as p';PRINT @SQL;EXEC SP_EXECUTESQL @SQL;GO

列轉行:

--列轉行的靜態方案:UNPIVOT,sql2005及以后版本SELECT * FROM dbo.pvtCustOrdersSELECT custid,years,qtyfrom dbo.pvtCustOrdersunpivot(qty for years in([2002],[2003],[2004]))as upGO--列轉行的動態方案:UNPIVOT,sql2005及以后版本--因為行是動態所以這里就從INFORMATION_SCHEMA.COLUMNS視圖中獲取列來構造行,同樣也使用了XML處理。DECLARE @SQL NVARCHAR(4000)=N'';SET @SQL=STUFF((SELECT N','+QUOTENAME(COLUMN_NAME ) FROM INFORMATION_SCHEMA.COLUMNSWHERE ORDINAL_POSITION>1 AND TABLE_NAME='PvtCustOrders'FOR XML PATH('')),1,1,N'')SET @SQL=N'SELECT custid,years,qty     from dbo.pvtCustOrders     unpivot(qty for years in('+@SQL+'))as up';PRINT @SQL;EXEC SP_EXECUTESQL @SQL;

總結

以上就是本文關于SQL行轉列和列轉行代碼詳解的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产欧美日韩久久| 国产欧美一级| 亚洲黄页一区| 欧美日韩中文另类| 激情综合色综合久久| 999在线视频| 国产啊啊啊视频在线观看| 91精品国产调教在线观看| 天堂中文在线视频| 午夜一区二区三区视频 | 精品调教chinesegay| 国产日韩三级| 中文在线一区| 亚洲久草视频| 日本中文字幕在线观看| 欧美在线视频第一页| а√天堂中文在线资源8| 亚洲免费观看在线观看| 热久久精品国产| 国产在线观看色| 国产伦精品免费视频| 国产91久久久久蜜臀青青天草二| 亚洲免费播放| 欧美日韩在线视频免费观看| 国产小视频免费在线网址| 在线亚洲免费| 日本免费在线视频不卡一不卡二| 欧美 日韩 国产在线观看| 国产最新在线| 美日韩精品免费视频| 亚洲热线99精品视频| 久久精品99国产国产精| va中文字幕| 国产不卡在线| 日韩精品午夜| 欧美日韩国产高清一区| 亚洲欧美999| 91麻豆精品国产91久久久使用方法 | 亚洲免费视频一区| 欧美日韩在线三级| 欧美三级日韩三级| 久久精品国产91精品亚洲| 在线视频你懂得一区| 日韩精品视频在线观看免费| 亚洲成年网站在线观看| 日韩亚洲欧美中文在线| a天堂中文在线官网在线| a视频免费看| 日韩精品三级| 一区二区视频在线观看免费的 | 97久久精品| 中文字幕亚洲字幕| 亚洲高清在线免费| 欧美日韩综合色| 婷婷精品进入| av免费不卡国产观看| 精品中文字幕在线播放| 亚洲热线99精品视频| 国产午夜在线观看| 久久久91精品| 99精品999| 欧美日韩国产三级| 91精品国产综合久久久久久漫画| 日本精品在线中文字幕| 国产一级在线免费观看| 精品日韩欧美| 国产www在线观看| 亚洲高清精品视频| 日韩三级视频在线看| 日韩你懂的电影在线观看| 伊人www22综合色| 亚洲国产专区| 亚洲永久免费视频| 欧美中文字幕第一页| 中文字幕第一页在线播放| 77777_亚洲午夜久久多人| 在线观看91精品国产入口| 久久久91精品国产| 久久久精品国产99久久精品芒果| 91精品久久久久久久91蜜桃| 成人无遮挡免费网站视频在线观看| 国产区在线看| 亚洲欧美日本国产专区一区| 一区二区不卡视频| 久久网站免费观看| 国产无套粉嫩白浆在线2022年 | 精品日韩欧美在线| 精品午夜av| 日韩三级视频在线播放| 国产日韩免费| 日韩中文欧美在线| 最新中文字幕在线播放 | 老司机久久99久久精品播放免费| 国产专区中文字幕| av一级在线| 国产一级在线免费观看| 日韩av综合在线观看| 国产欧美日韩在线观看| 国产资源在线观看入口av| 日韩一级中文字幕| 国产综合成人久久大片91| 久久夜色精品国产噜噜亚洲av| 久久电影国产免费久久电影| 亚洲黄色在线观看| 欧美日韩国产一二| 蜜桃精品视频| 中文字幕欧美日韩在线| 国产日韩av高清| 日本国产在线视频| 中文欧美日韩| 日韩精品在线视频观看| 欧美亚洲国产日韩2020| 亚洲午夜久久| 91精品在线免费| 在线观看免费国产小视频| 日韩美女中文字幕| 国产欧美日韩在线播放| 国产日韩精品久久久| 欧美日韩高清不卡| 亚洲校园欧美国产另类| 国产欧美日韩综合| 一区二区国产在线| 国产无遮挡在线视频免费观看| 国产成人精品999| 一区二区三区在线不卡| 91精品久久久久久久久久入口| 欧美日韩精品欧美日韩精品| 一区二区三区视频网站| 中文字幕 亚洲一区| 午夜精品一区二区三区视频免费看| 国产在线导航| av免费在线观看网址| 国产色在线视频| 色综合久久88色综合天天免费| 九七久久人人| 欧美在线视频二区| 欧美日韩国产黄色| 午夜亚洲一区| 成人禁用看黄a在线| 亚洲精品中文字幕乱码三区不卡| 日韩在线一区二区视频| 日韩高清不卡| 欧美一级搡bbbb搡bbbb| 91极品视频在线观看| 精品人妻一区二区免费视频| 在线综合 亚洲 欧美中文字幕| 最近中文字幕日韩精品| 久久精品一二三| 人人做人人澡人人爽欧美| 97国产视频| 欧美 日韩 综合| 免费国产h视频在线观看86| 91精品国产99| 日韩精品丝袜在线| 中文字幕在线播出| 欧美亚洲另类制服自拍| 日韩午夜黄色| 亚洲视频色图| 国产欧美日韩亚洲| 国产视频一区三区| 日韩精品视频免费在线观看| 欧美亚洲天堂网| 亚洲国产欧美91| www.91香蕉视频| 久久精品蜜桃| 亚洲午夜久久| 99精品人妻国产毛片| 日韩在线观看视频一区| 欧美熟妇乱码在线一区| 91久久久精品国产| 中文字幕亚洲欧美| 91精品国产丝袜白色高跟鞋| 日韩三级视频在线看| 日韩欧美一二三| 中文字幕一区不卡| 日韩欧美国产高清91| 国产不卡视频在线| 国产91大片| 国产一区高清视频| 国产福利一区二区| 1区不卡电影| 欧美日韩在线观看一区| 99精品电影| 久久精品99久久久久久久久 | 不卡av免费在线| 亚洲深夜福利| 亚洲久草视频| 天天摸日日摸狠狠添| 在线欧美日韩国产| av中文网站| 亚州福利视频| 日韩精品在线免费播放| 91麻豆视频网站| 国产高清在线视频| 国产区在线看| 国产高清在线观看| 91精品国产经典在线观看| av免费看在线| 精品日韩在线观看| 亚洲高清中文字幕| 久久电影国产免费久久电影| 中文字幕精品www乱入免费视频| 欧美日韩第一| 日韩欧美中文字幕在线播放| 欧美久久一二三四区| 欧美日韩高清在线| 欧美日韩国产123区| 中文字幕欧美日韩| 欧美国产一级片| 亚洲欧洲在线观看av| 亚州黄色一级| 人人做人人澡人人爽欧美| 成片免费观看| 国产视频三级在线观看播放| 韩国av一区二区| 中文字幕在线看精品乱码| 欧美日韩在线视频首页| 亚洲欧美视频一区二区三区| 欧美日韩中文字幕综合视频| 亚洲欧洲三级| 欧美日韩中文字幕日韩欧美| 国产黄色一级片| 91国内在线| 久久夜色精品国产欧美乱极品| 日本啊v在线| 亚洲三级网站| 一区二区三区在线免费| 91精品国产丝袜白色高跟鞋| 一区二区三区在线播放欧美| 欧美不卡视频一区| 欧美中日韩在线| 二区三区不卡不卡视频| 一级片免费在线| lutube成人福利在线观看| 久久欧美中文字幕| 日韩高清在线一区二区| www.三级.com| 日韩在线视频免费观看| 国产精品一区二三区| 日韩不卡在线观看| 国产69精品久久app免费版| 国产福利一区二区精品秒拍| 亚洲一区在线观看免费| 中文字幕在线看精品乱码| 日韩欧美国产三级| 最近中文字幕第一页| 91精品免费在线观看| 日韩中文字幕在线一区| 欧美日韩国产999| 91欧美日韩在线| 日韩午夜黄色| av免费不卡国产观看| 欧美一卡2卡3卡4卡| 久久蜜桃精品| 日韩中文欧美| 日韩在线不卡| 欧美日韩色综合| 亚洲一区日韩精品中文字幕| 中文字幕欧美日韩va免费视频| 一区二区国产在线| 日本国产一区| 日韩欧美综合| 亚洲福利精品在线| 中文av字幕一区| 国产一区久久久| 日韩一级免费在线观看| 国产婷婷在线观看| 亚洲免费精品| 欧美日韩中文字幕在线视频| www.精品视频| 欧美片网站免费| 亚洲中文字幕一区| 久久人人精品| 91麻豆精品在线| 欧美性生交大片免费| 一区二区视频在线观看免费的| 久久精品不卡| 91精品国产91久久久久久久久 | 国产黄色在线播放| 美女在线视频一区| 国产欧美日韩91| 亚洲a中文字幕| 一区二区三区免费看视频| 国产在线精品国自产拍免费| 国产高清一级片| 欧美日韩国产片| 日韩精品福利一区二区三区| 一区二区精品免费| 日韩精品在线网站| 精品日韩av| 亚洲视频中文字幕| 日韩欧美一卡二卡| 精品视频国产| 国产欧美日韩视频| 欧美日韩亚洲国内综合网| 欧美日韩在线视频一区| 在线日韩中文字幕| 一区在线视频观看| 久久永久免费视频| 久久精品日韩无码| 欧美日韩国产一二| 欧美三级日本三级少妇99| 欧美国产中文| 欧美亚洲另类制服自拍| 欧美变态tickling挠脚心| 亚洲欧洲日产国码av系列天堂| 久久夜色精品国产噜噜亚洲av| 国产真实乱子伦精品视频| 国产日韩1区| 日韩在线视频免费观看| www.三级.com| 一区二区三区鲁丝不卡| 91精品婷婷国产综合久久竹菊| 日韩欧美高清在线视频| 日本a口亚洲| 日韩视频一区二区在线观看| 久久久水蜜桃| 亚洲国产91精品在线观看| 国产农村妇女精品一二区| 国产日产一区二区| 国产三级视频在线播放线观看| 日韩在线观看a| 精品三区视频| 日韩精品乱码av一区二区| 人成免费在线视频| 精品免费视频| 欧美日韩午夜在线视频| 日韩欧美在线视频日韩欧美在线视频| 欧美日韩在线观看一区| 亚洲制服丝袜一区| 亚洲三级av| 国产视频中文字幕| 亚洲乱码视频| 日韩精品午夜| 亚洲综合在线小说| 精品日韩av一区二区| 国产成人精品999在线观看| 中文字幕在线观看国产| 一级特黄aaa大片在线观看| aaa欧美日韩| 国产一级在线免费观看| 亚洲国产午夜精品| 欧美一级日韩不卡播放免费| 高清一区二区| 一区二区不卡在线| 激情五月综合| 九九精品调教| 日韩视频精品在线| 中文字幕精品在线| 亚洲免费专区| 国产视频1区| 内射国产内射夫妻免费频道| 久久精品夜夜夜夜久久| 中文字幕综合在线| 在线观看免费国产小视频| 视频在线一区二区| 91精品国产综合久久精品| 久草视频观看| 99精品视频99| 国产精品福利视频一区二区三区| 在线日韩中文字幕| 欧美日韩在线中文字幕| 中文字幕 亚洲视频| 91精品国产调教在线观看| 一级网站免费观看| 久久69成人| 91精品在线视频观看| 婷婷精品进入| 欧美日韩激情在线一区二区三区| 一区二区91| 拍真实国产伦偷精品| 欧美日韩中文字幕综合视频| av午夜在线| 国产一级久久久| 欧美日韩国产一中文字不卡| 欧美日韩视频免费看| 精人妻一区二区三区| 日本精品免费观看高清观看| 欧美日韩精品中文字幕| 欧美亚洲综合视频| 国产欧美日韩中文字幕在线| 日韩精品在线观看网站| 麻豆一区二区99久久久久| 91精品国产91久久久久| 精品免费视频| 精品一二三四区| 日韩三级一区| 午夜av一区二区| 欧美日韩综合视频| 成人一区二区不卡免费| 午夜亚洲一区| 日韩精品视频在线观看免费| 久本草在线中文字幕亚洲欧美| 欧美黄页在线免费观看| 亚洲第一视频在线观看| 福利一区二区| 国产在线欧美日韩| 国产91久久久久| 亚洲乱码中文字幕综合| 欧美日韩国产系列|