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

岑溪ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
在SQL Server數(shù)據(jù)庫中,我們經(jīng)常遇到數(shù)據(jù)存儲在縱表(Column-oriented)和橫表(Row-oriented)兩種形式,縱表通常用于存儲具有相同屬性類型的數(shù)據(jù),統(tǒng)計數(shù)據(jù)、日志信息等;而橫表則適用于存儲不同屬性類型的數(shù)據(jù),如:用戶信息、商品詳情等,在實際應(yīng)用中,我們可能會遇到需要將縱表轉(zhuǎn)換為橫表,或者將橫表轉(zhuǎn)換為縱表的需求,本篇文章將詳細(xì)介紹SQL Server中縱表與橫表相互轉(zhuǎn)換的方法。
縱表轉(zhuǎn)橫表
1、使用動態(tài)SQL
當(dāng)我們知道縱表的結(jié)構(gòu)時,可以使用動態(tài)SQL來實現(xiàn)縱表轉(zhuǎn)橫表,以下是一個示例:
(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)編寫動態(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ù)量固定時,可以直接使用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)已知時,可以通過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、使用動態(tài)SQL
當(dāng)橫表的列數(shù)量不固定時,可以使用動態(tài)SQL來實現(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)換的幾種方法,包括使用動態(tài)SQL、PIVOT函數(shù)、UNION ALL等,這些方法在實際應(yīng)用中具有較高的實用價值,可以根據(jù)具體需求選擇合適的方法進(jìn)行數(shù)據(jù)轉(zhuǎn)換,需要注意的是,使用動態(tài)SQL時,要注意防范SQL注入風(fēng)險,確保數(shù)據(jù)安全。
在實際項目中,我們還需要根據(jù)實際情況對縱表和橫表進(jìn)行優(yōu)化,索引優(yōu)化、查詢優(yōu)化等,還可以通過編寫存儲過程、函數(shù)等封裝縱表與橫表轉(zhuǎn)換的邏輯,提高代碼的復(fù)用性和可維護(hù)性。
掌握縱表與橫表相互轉(zhuǎn)換的方法,有助于我們更好地應(yīng)對各種數(shù)據(jù)存儲和查詢需求,提高SQL Server數(shù)據(jù)庫的性能和效率,希望本文能對您在實際工作中有所幫助。
當(dāng)前題目:SQLServer縱表與橫表相互轉(zhuǎn)換的方法
本文來源:http://fisionsoft.com.cn/article/ccspgps.html


咨詢
建站咨詢
