Home >Database >Mysql Tutorial >How to Convert Columns to Rows in SQL Server (T-SQL)?

How to Convert Columns to Rows in SQL Server (T-SQL)?

Linda Hamilton
Linda HamiltonOriginal
2025-01-21 19:22:10500browse

How to Convert Columns to Rows in SQL Server (T-SQL)?

Several methods to convert columns into rows in SQL Server

This article describes how to convert column data in a SQL Server table into row data. Assume your table structure is as follows:

<code class="language-sql">[ID] [EntityID] [Indicator1] [Indicator2] [Indicator3] ... [Indicator150]</code>

The goal is to convert the data into the following structure:

<code class="language-sql">[ID] [EntityId] [IndicatorName] [IndicatorValue]</code>

Example of target results:

<code>1 1 'Indicator1' 'Indicator 1 的值'
2 1 'Indicator2' 'Indicator 2 的值'
3 1 'Indicator3' 'Indicator 3 的值'
4 2 'Indicator1' 'Indicator 1 的值'</code>

Solution:

The following methods can achieve column-to-row conversion:

1. Use UNPIVOT function

The UNPIVOT function efficiently converts columns into rows:

<code class="language-sql">SELECT id, entityId, indicatorname, indicatorvalue
FROM yourtable
UNPIVOT
(
  indicatorvalue
  FOR indicatorname IN (Indicator1, Indicator2, Indicator3)
) unpiv;</code>

Please ensure that the data types of the columns involved in the conversion are consistent.

2. Use CROSS APPLY and UNION ALL

Another way is to use CROSS APPLY and 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>

3. Use CROSS APPLY and VALUES (applicable to newer versions of SQL Server)

In newer SQL Server versions, you can use the CROSS APPLY and VALUES clauses:

<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>

4. Use dynamic SQL (suitable for large number of Indicator columns)

For large tables with a large number of Indicator columns, you can use dynamic SQL to automatically generate queries:

<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(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

SET @query = 'SELECT id, entityId, indicatorname, indicatorvalue
              FROM yourtable
              UNPIVOT
              (
                indicatorvalue
                FOR indicatorname IN (' + @colsUnpivot + ')
              ) u';

EXEC sp_executesql @query;</code>

Which method you choose depends on the size of your table and your SQL Server version. For fewer columns, the first three methods are sufficient; for tables with a large number of Indicator columns, the dynamic SQL method is more efficient. Remember to replace yourtable with your actual table name.

The above is the detailed content of How to Convert Columns to Rows in SQL Server (T-SQL)?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn