使用動態樞軸在 T-SQL 中轉換資料
有時需要將資料從寬格式轉換為更結構化的表格格式。考慮這樣一種情況:一個表包含多個不同資料類型和值的列,需要動態地透視資料以獲得一個結果集,該結果集為每個 ID 和相應的列值提供不同的行。
實現此轉換的一種方法是使用 T-SQL 的動態樞軸功能。以下範例示範如何使用 T-SQL 動態透視資料:
<code class="language-sql">CREATE TABLE #Table ( ID INT, ColumnName VARCHAR(250), Value VARCHAR(250) ); -- 示例数据 INSERT INTO #Table SELECT 1,'name','Peter'; INSERT INTO #Table SELECT 1,'phone','12345678'; INSERT INTO #Table SELECT 1,'email','[email protected]'; INSERT INTO #Table SELECT 2,'name','John'; INSERT INTO #Table SELECT 2,'phone','87654321'; INSERT INTO #Table SELECT 2,'email','[email protected]'; INSERT INTO #Table SELECT 3,'name','Sarah'; INSERT INTO #Table SELECT 3,'phone','55667788'; INSERT INTO #Table SELECT 3,'email','[email protected]'; DECLARE @cols NVARCHAR(2000); DECLARE @query NVARCHAR(4000); -- 动态构建枢轴的列列表 SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT '],[' + t.ColumnName FROM #Table AS t -- 按 ID 排序以确保列顺序一致 ORDER BY '],[' + CAST(t.ID AS VARCHAR(10)) FOR XML PATH('') ), 1, 2, '') + ']' SELECT @cols; -- 动态构建 PIVOT 查询 SET @query = N'SELECT ID,'+ @cols +' FROM (SELECT t1.ID,t1.ColumnName , t1.Value FROM #Table AS t1) p PIVOT (MAX([Value]) FOR ColumnName IN ( '+ @cols +' )) AS pvt;'; -- 执行动态 PIVOT 查询 EXECUTE(@query); -- 删除临时表 DROP TABLE #Table;</code>
執行上述腳本的結果將是一個透視表,其中包含每個 ID 和對應列值的不同的行。
以上是如何使用動態透視在 T-SQL 中動態透視資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!