新聞中心
SQL Server中縱表與橫表相互轉(zhuǎn)換的技巧與實(shí)現(xiàn)方法

岑溪ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書(shū)合作)期待與您的合作!
在SQL Server數(shù)據(jù)庫(kù)中,我們經(jīng)常遇到數(shù)據(jù)存儲(chǔ)在縱表(Column-oriented)和橫表(Row-oriented)兩種形式,縱表通常用于存儲(chǔ)具有相同屬性類(lèi)型的數(shù)據(jù),統(tǒng)計(jì)數(shù)據(jù)、日志信息等;而橫表則適用于存儲(chǔ)不同屬性類(lèi)型的數(shù)據(jù),如:用戶信息、商品詳情等,在實(shí)際應(yīng)用中,我們可能會(huì)遇到需要將縱表轉(zhuǎn)換為橫表,或者將橫表轉(zhuǎn)換為縱表的需求,本篇文章將詳細(xì)介紹SQL Server中縱表與橫表相互轉(zhuǎn)換的方法。
縱表轉(zhuǎn)橫表
1、使用動(dòng)態(tài)SQL
當(dāng)我們知道縱表的結(jié)構(gòu)時(shí),可以使用動(dòng)態(tài)SQL來(lái)實(shí)現(xiàn)縱表轉(zhuǎn)橫表,以下是一個(gè)示例:
(1)創(chuàng)建示例縱表:
CREATE TABLE ZongTable
(
ID INT,
Year INT,
Value INT
)
GO
INSERT INTO ZongTable VALUES (1, 2018, 100)
INSERT INTO ZongTable VALUES (1, 2019, 150)
INSERT INTO ZongTable VALUES (1, 2020, 200)
GO
(2)編寫(xiě)動(dòng)態(tài)SQL:
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'SELECT ID, '
SELECT @SQL = @SQL + N'[' + CAST(Year AS NVARCHAR(10)) + '] AS [' + CAST(Year AS NVARCHAR(10)) + '], '
FROM ZongTable
GROUP BY Year
SET @SQL = LEFT(@SQL, LEN(@SQL) - 1) + N' FROM ZongTable PIVOT (SUM(Value) FOR Year IN ('
SELECT @SQL = @SQL + N'[' + CAST(Year AS NVARCHAR(10)) + '], '
FROM ZongTable
GROUP BY Year
SET @SQL = LEFT(@SQL, LEN(@SQL) - 1) + N')) AS PvtTable'
EXEC sp_executesql @SQL
2、使用PIVOT函數(shù)
當(dāng)縱表的列數(shù)量固定時(shí),可以直接使用PIVOT函數(shù)進(jìn)行縱表轉(zhuǎn)橫表:
SELECT ID,
[2018] AS [2018],
[2019] AS [2019],
[2020] AS [2020]
FROM ZongTable
PIVOT (SUM(Value) FOR Year IN ([2018], [2019], [2020])) AS PvtTable
橫表轉(zhuǎn)縱表
1、使用UNION ALL
當(dāng)橫表的結(jié)構(gòu)已知時(shí),可以通過(guò)UNION ALL將橫表轉(zhuǎn)換為縱表:
CREATE TABLE HongTable
(
ID INT,
Year INT,
Value INT
)
GO
INSERT INTO HongTable VALUES (1, 2018, 100)
INSERT INTO HongTable VALUES (1, 2019, 150)
INSERT INTO HongTable VALUES (1, 2020, 200)
GO
SELECT ID, 2018 AS Year, Value FROM HongTable WHERE Year = 2018
UNION ALL
SELECT ID, 2019 AS Year, Value FROM HongTable WHERE Year = 2019
UNION ALL
SELECT ID, 2020 AS Year, Value FROM HongTable WHERE Year = 2020
2、使用動(dòng)態(tài)SQL
當(dāng)橫表的列數(shù)量不固定時(shí),可以使用動(dòng)態(tài)SQL來(lái)實(shí)現(xiàn)橫表轉(zhuǎn)縱表:
DECLARE @SQL NVARCHAR(MAX) SET @SQL = N'' SELECT @SQL = @SQL + N'SELECT ID, ' + QUOTENAME(Year) + N' AS Year, ' + QUOTENAME(Year) + N' AS Value FROM HongTable WHERE Year = ' + CAST(Year AS NVARCHAR(10)) + N' UNION ALL ' FROM HongTable GROUP BY Year SET @SQL = LEFT(@SQL, LEN(@SQL) - 10) EXEC sp_executesql @SQL
本文介紹了SQL Server中縱表與橫表相互轉(zhuǎn)換的幾種方法,包括使用動(dòng)態(tài)SQL、PIVOT函數(shù)、UNION ALL等,這些方法在實(shí)際應(yīng)用中具有較高的實(shí)用價(jià)值,可以根據(jù)具體需求選擇合適的方法進(jìn)行數(shù)據(jù)轉(zhuǎn)換,需要注意的是,使用動(dòng)態(tài)SQL時(shí),要注意防范SQL注入風(fēng)險(xiǎn),確保數(shù)據(jù)安全。
在實(shí)際項(xiàng)目中,我們還需要根據(jù)實(shí)際情況對(duì)縱表和橫表進(jìn)行優(yōu)化,索引優(yōu)化、查詢優(yōu)化等,還可以通過(guò)編寫(xiě)存儲(chǔ)過(guò)程、函數(shù)等封裝縱表與橫表轉(zhuǎn)換的邏輯,提高代碼的復(fù)用性和可維護(hù)性。
掌握縱表與橫表相互轉(zhuǎn)換的方法,有助于我們更好地應(yīng)對(duì)各種數(shù)據(jù)存儲(chǔ)和查詢需求,提高SQL Server數(shù)據(jù)庫(kù)的性能和效率,希望本文能對(duì)您在實(shí)際工作中有所幫助。
網(wǎng)頁(yè)標(biāo)題:SQLServer縱表與橫表相互轉(zhuǎn)換的方法
分享路徑:http://www.dlmjj.cn/article/ccspgps.html


咨詢
建站咨詢
