使用动态枢轴在 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中文网其他相关文章!