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中文網其他相關文章!