婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > SQL行轉列和列轉行代碼詳解

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

熱門標簽:外呼系統電銷專用 千呼電銷機器人價格 優質地圖標注 京華物流公司地圖標注 武漢長沙外呼系統方法和技巧 怎樣在地圖上標注路線圖標 奧威地圖標注多個地方 百度地圖標注不同路線 智能語音外呼系統選哪家

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

--創建測試環境
USE tempdb;
GO
IF OBJECT_ID('dbo.Orders') IS NOT NULL
 DROP TABLE dbo.Orders;
GO
CREATE 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,兼容sql2000
select 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 orders
group by custid;
GO
--行轉列的靜態方案二:PIVOT,sql2005及以后版本
select *
from (select custid,YEAR(orderdate) as years,qty from orders) as ord
pivot(sum(qty) for years in([2002],[2003],[2004]))as p
GO

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

--既然是用到了動態SQL,就有一個老話題:SQL注入。建一個注入性字符的判斷函數。
CREATE FUNCTION [dbo].[fn_CheckSQLInjection]
(
 @Col nvarchar(4000)
)
RETURNS BIT --如果存在可能的注入字符返回true,反之返回false
AS
BEGIN
DECLARE @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 @result
END
GO
--行轉列的動態方案一:CASE WHEN,兼容sql2000
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'';
WHILE @Y IS NOT NULL
BEGIN
 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);
END
IF dbo.fn_CheckSQLInjection(@SQL)=0
SET @SQL=N'SELECT custid'+@SQL+N' FROM orders group by custid'
PRINT @SQL
EXEC sp_executesql @SQL
GO
--行轉列的動態方案二: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)=0
SET @SQL=N'select * from (select DISTINCT custid,YEAR(orderdate) as years,qty from orders) as ord
pivot(sum(qty) for years in('+@SQL+N'))as p';
PRINT @SQL;
EXEC SP_EXECUTESQL @SQL;
GO

列轉行:

--列轉行的靜態方案:UNPIVOT,sql2005及以后版本
SELECT * FROM dbo.pvtCustOrders
SELECT custid,years,qty
from dbo.pvtCustOrders
unpivot(qty for years in([2002],[2003],[2004]))as up
GO
--列轉行的動態方案:UNPIVOT,sql2005及以后版本
--因為行是動態所以這里就從INFORMATION_SCHEMA.COLUMNS視圖中獲取列來構造行,同樣也使用了XML處理。
DECLARE @SQL NVARCHAR(4000)=N'';
SET @SQL=STUFF((SELECT N','+QUOTENAME(COLUMN_NAME ) FROM INFORMATION_SCHEMA.COLUMNS
WHERE 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行轉列和列轉行代碼詳解的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站:Mysql中FIND_IN_SET()和IN區別簡析、淺談sqlserver下float的不確定性、MYSQL子查詢和嵌套查詢優化實例解析等,有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對腳本之家網站的支持!

您可能感興趣的文章:
  • mysql 行轉列和列轉行實例詳解
  • sql語句實現行轉列的3種方法實例
  • SQLServer行轉列實現思路記錄
  • MySQL存儲過程中使用動態行轉列
  • mssql 數據庫表行轉列,列轉行終極方案
  • Sql Server 2000 行轉列的實現(橫排)
  • SQL查詢語句行轉列橫向顯示實例解析
  • sql動態行轉列的兩種方法
  • table 行轉列的sql詳解
  • SQL基礎教程之行轉列Pivot函數

標簽:益陽 天水 威海 七臺河 宿州 防疫戰設 銅仁 來賓

巨人網絡通訊聲明:本文標題《SQL行轉列和列轉行代碼詳解》,本文關鍵詞  SQL,行轉列,和,列,轉行,代碼,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL行轉列和列轉行代碼詳解》相關的同類信息!
  • 本頁收集關于SQL行轉列和列轉行代碼詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久精品二区亚洲w码| 久久99精品国产麻豆婷婷| 久久99精品国产91久久来源| 自拍av一区二区三区| 久久er99精品| 欧美亚洲愉拍一区二区| 亚洲精品国产高清久久伦理二区| 久久久久久免费毛片精品| 欧美mv日韩mv国产网站| 欧美大片免费久久精品三p| 精品久久久久香蕉网| 久久婷婷色综合| 中文字幕精品一区二区三区精品| 中文欧美字幕免费| 中文字幕亚洲精品在线观看| 亚洲柠檬福利资源导航| 欧美本精品男人aⅴ天堂| 久久婷婷色综合| 日韩理论电影院| 亚洲电影你懂得| 男男gaygay亚洲| 免费在线欧美视频| www.日韩在线| 国产91精品露脸国语对白| 精品一区二区在线视频| 久久精品国产一区二区三 | 国产精一品亚洲二区在线视频| 美国三级日本三级久久99 | a级高清视频欧美日韩| 成人深夜福利app| 欧美午夜免费电影| 久久婷婷色综合| 亚洲一二三四在线| 综合av第一页| 免费视频最近日韩| 捆绑变态av一区二区三区| 日本欧美大码aⅴ在线播放| 亚洲va韩国va欧美va| 秋霞电影一区二区| 亚洲一区在线电影| 日韩国产精品91| 精品一区二区免费视频| 91麻豆国产香蕉久久精品| 26uuu国产日韩综合| 欧美韩国日本不卡| 色婷婷综合久久久久中文 | 日韩欧美久久一区| 亚洲欧洲精品一区二区三区不卡| 婷婷国产在线综合| 国产精品一区二区不卡| 在线视频亚洲一区| 波多野洁衣一区| 中文字幕亚洲电影| 免费在线看成人av| 在线成人av网站| 亚洲一区二区三区视频在线播放| 国产东北露脸精品视频| 91精品国产综合久久国产大片| 亚洲欧美一区二区视频| 粉嫩av亚洲一区二区图片| 日韩欧美一级片| 日韩电影在线观看一区| 99久久精品一区| 国产精品天天看| 麻豆精品在线播放| 欧美亚洲高清一区| 一区二区三区久久久| 国产大片一区二区| 亚洲综合图片区| av动漫一区二区| 国产精品成人一区二区艾草 | ㊣最新国产の精品bt伙计久久| 国产欧美一区二区三区在线看蜜臀 | 色网站国产精品| 日韩欧美国产综合在线一区二区三区| 国产视频在线观看一区二区三区 | 国内久久婷婷综合| 欧美三级电影一区| 国产精品国产a| 精品一区二区三区蜜桃| 在线91免费看| 精品一区二区影视| 国产日韩精品一区| 福利一区二区在线观看| 久久久精品免费免费| 国产精品2024| 国产凹凸在线观看一区二区| 国产欧美一区二区精品婷婷| 另类小说综合欧美亚洲| 美女视频一区在线观看| 精品欧美一区二区久久| 国产黑丝在线一区二区三区| 久久久久国产精品免费免费搜索| 偷拍日韩校园综合在线| 欧美一级xxx| 久久精品久久久精品美女| 久久久99精品免费观看不卡| www.欧美精品一二区| 亚洲一级二级三级在线免费观看| 欧美影院午夜播放| 天堂成人国产精品一区| 欧美日韩中文字幕一区二区| 国产精品一区二区三区网站| 6080日韩午夜伦伦午夜伦| 日韩成人一区二区| 久久久九九九九| 欧美色倩网站大全免费| 大美女一区二区三区| 久久婷婷综合激情| 欧美日韩高清一区二区不卡| 国产成人av影院| 肉肉av福利一精品导航| 亚洲国产精品99久久久久久久久| 欧美性极品少妇| 国产91高潮流白浆在线麻豆| 香蕉成人伊视频在线观看| 久久综合久色欧美综合狠狠| 欧美在线啊v一区| 国产成人免费视频网站| 日韩综合小视频| 亚洲美女区一区| 久久女同精品一区二区| 欧美视频一区在线| 国产真实乱对白精彩久久| 亚洲精品videosex极品| 欧美色欧美亚洲另类二区| 国产精品乡下勾搭老头1| 国产精品网站在线播放| 欧美性受极品xxxx喷水| 欧美大度的电影原声| 91色porny| 国产精品一区二区三区四区| 久久av中文字幕片| 亚洲成人av一区二区| 久久久不卡影院| 欧美精品日韩精品| 福利电影一区二区三区| 免费久久99精品国产| 婷婷久久综合九色综合绿巨人 | 成人黄色网址在线观看| 九色porny丨国产精品| 欧美国产精品专区| 91精品国产综合久久久蜜臀图片| 91九色02白丝porn| av激情亚洲男人天堂| 95精品视频在线| 99久久精品免费精品国产| 成人黄色小视频| 91啪亚洲精品| 高清在线观看日韩| 天天亚洲美女在线视频| 国产精品视频线看| 国产精品伦理在线| 国产精品二区一区二区aⅴ污介绍| 久久久久久免费网| 国产精品精品国产色婷婷| 亚洲天堂精品在线观看| 亚洲精品国产无套在线观| 亚洲成人资源在线| 中文字幕日韩一区| 中文字幕乱码一区二区免费| 久久综合九色综合97_久久久| 欧美日韩一区视频| 欧美人伦禁忌dvd放荡欲情| 欧美一区二区在线免费播放 | 亚洲色图在线播放| 亚洲欧美色图小说| 亚洲国产sm捆绑调教视频| 香蕉成人啪国产精品视频综合网| 奇米色一区二区| 美腿丝袜亚洲综合| 激情欧美一区二区三区在线观看| 国产酒店精品激情| 99精品国产91久久久久久| 91猫先生在线| 欧美日韩中文国产| 国产一区二区在线影院| 国产91精品在线观看| 欧美三级中文字| 久久午夜电影网| 伊人婷婷欧美激情| 午夜精品免费在线观看| 久久精品国产秦先生| 亚洲欧美电影一区二区| 亚洲在线免费播放| 亚洲成人av免费| 国产ts人妖一区二区| 欧美日韩一区二区三区不卡| 欧美日韩一区高清| 欧美视频一区二| 欧美日精品一区视频| 日韩午夜精品视频| 一区二区欧美在线观看| 国内精品免费在线观看| 在线精品视频免费播放| 色狠狠一区二区三区香蕉| 久久麻豆一区二区| 午夜精品aaa| 91麻豆精品视频| 欧美精品欧美精品系列|