Maison >base de données >tutoriel mysql >Comment convertir des colonnes en lignes dans SQL Server (T-SQL) ?

Comment convertir des colonnes en lignes dans SQL Server (T-SQL) ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-21 19:22:10580parcourir

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

Plusieurs méthodes pour convertir des colonnes en lignes dans SQL Server

Cet article décrit comment convertir les données de colonne d'une table SQL Server en données de ligne. Supposons que la structure de votre table soit la suivante :

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

Le but est de convertir les données dans la structure suivante :

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

Exemple de résultats cibles :

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

Solution :

Les méthodes suivantes peuvent réaliser une conversion colonne en ligne :

1. Utilisez la fonction UNPIVOT

La fonction UNPIVOT convertit efficacement les colonnes en lignes :

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

Veuillez vous assurer que les types de données des colonnes impliquées dans la conversion sont cohérents.

2. Utilisez CROSS APPLY et UNION ALL

Une autre façon consiste à utiliser CROSS APPLY et 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. Utilisez CROSS APPLY et VALUES (applicable aux versions plus récentes de SQL Server)

Dans les versions plus récentes de SQL Server, vous pouvez utiliser les clauses CROSS APPLY et VALUES :

<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. Utiliser du SQL dynamique (adapté à un grand nombre de colonnes d'indicateurs)

Pour les grandes tables comportant un grand nombre de colonnes d'indicateurs, vous pouvez utiliser du SQL dynamique pour générer automatiquement des requêtes :

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

La méthode que vous choisissez dépend de la taille de votre table et de votre version de SQL Server. Pour moins de colonnes, les trois premières méthodes suffisent ; pour les tables comportant un grand nombre de Indicator colonnes, la méthode SQL dynamique est plus efficace. N'oubliez pas de remplacer yourtable par le nom réel de votre table.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn