SQL Server:列转行
在SQL Server中,您可能需要将包含多个指示符列的表转换为每个指示符及其对应值的行的结构。这可以通过几种技术来实现。
UNPIVOT函数
UNPIVOT函数是将列转换为行的直接方法。它将指定的列转换为行,原始列名成为标记为“indicatorname”的新行。原始列的值成为标记为“indicatorvalue”的行。
<code class="language-sql">SELECT id, entityId, indicatorname, indicatorvalue FROM yourtable UNPIVOT ( indicatorvalue FOR indicatorname IN (Indicator1, Indicator2, Indicator3) ) unpiv;</code>
使用UNION ALL的CROSS APPLY
另一种方法是将CROSS APPLY与UNION ALL结合使用:
<code class="language-sql">SELECT id, entityid, indicatorname, indicatorvalue FROM yourtable CROSS APPLY ( SELECT 'Indicator1', Indicator1 UNION ALL SELECT 'Indicator2', Indicator2 UNION ALL SELECT 'Indicator3', Indicator3 UNION ALL SELECT 'Indicator4', Indicator4 ) c (indicatorname, indicatorvalue);</code>
使用VALUES子句的CROSS APPLY
如果您的SQL Server版本支持,您还可以利用VALUES子句与CROSS APPLY:
<code class="language-sql">SELECT id, entityid, indicatorname, indicatorvalue FROM yourtable CROSS APPLY ( VALUES ('Indicator1', Indicator1), ('Indicator2', Indicator2), ('Indicator3', Indicator3), ('Indicator4', Indicator4) ) c (indicatorname, indicatorvalue);</code>
动态SQL
对于具有许多指示符列的表,手动生成必要的SQL语句可能会很繁琐。动态SQL可以自动化此过程:
<code class="language-sql">DECLARE @colsUnpivot AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) SELECT @colsUnpivot = STUFF((SELECT ',' + QUOTENAME(C.column_name) FROM INFORMATION_SCHEMA.COLUMNS AS C WHERE C.table_name = 'yourtable' AND C.column_name LIKE 'Indicator%' FOR XML PATH('')), 1, 1, '') SET @query = 'SELECT id, entityId, indicatorname, indicatorvalue FROM yourtable UNPIVOT ( indicatorvalue FOR indicatorname IN (' + @colsunpivot +') ) u' EXEC sp_executesql @query;</code>
这些技术提供了在SQL Server中将列转换为行的灵活方法,可以适应不同的表结构和数据需求。
以上是如何在SQL Server中高效地将列转换为行?的详细内容。更多信息请关注PHP中文网其他相关文章!