


Comment convertir des colonnes en lignes dans SQL Server (T-SQL) ?
Jan 21, 2025 pm 07:22 PMPlusieurs 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 :
[ID] [EntityID] [Indicator1] [Indicator2] [Indicator3] ... [Indicator150]
Le but est de convertir les données dans la structure suivante :
[ID] [EntityId] [IndicatorName] [IndicatorValue]
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 :
SELECT id, entityId, indicatorname, indicatorvalue FROM yourtable UNPIVOT ( indicatorvalue FOR indicatorname IN (Indicator1, Indicator2, Indicator3) ) unpiv;
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 :
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);
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 :
SELECT id, entityid, indicatorname, indicatorvalue FROM yourtable CROSS APPLY ( VALUES ('Indicator1', Indicator1), ('Indicator2', Indicator2), ('Indicator3', Indicator3), ('Indicator4', Indicator4) ) c (indicatorname, indicatorvalue);
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 :
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;
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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Réduisez l'utilisation de la mémoire MySQL dans Docker

Comment modifier une table dans MySQL en utilisant l'instruction ALTER TABLE?

Comment résoudre le problème de MySQL ne peut pas ouvrir la bibliothèque partagée

Exécutez MySQL dans Linux (avec / sans conteneur Podman avec phpmyadmin)

Exécuter plusieurs versions MySQL sur macOS: un guide étape par étape

Comment sécuriser MySQL contre les vulnérabilités communes (injection SQL, attaques par force brute)?

Comment configurer le cryptage SSL / TLS pour les connexions MySQL?
