Maison >base de données >tutoriel mysql >Comment puis-je transposer efficacement des lignes en colonnes dans SQL Server ?

Comment puis-je transposer efficacement des lignes en colonnes dans SQL Server ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-05 00:25:42171parcourir

How Can I Efficiently Transpose Rows to Columns in SQL Server?

Transposition de lignes en colonnes dans SQL Server

La transposition de lignes en colonnes dans SQL Server est une tâche courante lorsque vous travaillez avec des données stockées sous forme de tableau. Traditionnellement, cela était réalisé à l’aide de curseurs, ce qui peut prendre du temps et être inefficace. Cet article explore des méthodes alternatives de transposition de lignes, offrant des solutions à la fois élégantes et performantes.

Agrégation conditionnelle

Une approche consiste à utiliser l'agrégation conditionnelle, qui exploite la fonction COALESCE() pour gérer les éléments manquants. valeurs.

SELECT TimeSeconds,
       COALESCE(MAX(CASE WHEN TagID = 'A1' THEN Value END), 'n/a') A1,
       COALESCE(MAX(CASE WHEN TagID = 'A2' THEN Value END), 'n/a') A2,
       COALESCE(MAX(CASE WHEN TagID = 'A3' THEN Value END), 'n/a') A3,
       COALESCE(MAX(CASE WHEN TagID = 'A4' THEN Value END), 'n/a') A4
  FROM table1
 GROUP BY TimeSeconds

Cette requête génère une sortie avec des valeurs d'espace réservé (« n/a ») pour les valeurs manquantes. data.

PIVOT

Une autre option consiste à utiliser la fonction PIVOT, qui permet la création de colonnes dynamiques.

SELECT TimeSeconds, A1, A2, A3, A4
  FROM
(
  SELECT TimeSeconds, TagID, Value
    FROM table1
) s
PIVOT
(
  MAX(Value) FOR TagID IN (A1, A2, A3, A4)
) p

Cette approche génère une sortie avec des valeurs NULL pour les données manquantes. .

SQL dynamique

Si le nombre de colonnes n'est pas fixe et doit être déterminé dynamiquement, du SQL dynamique peut être utilisé.

DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX)

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(TagID)
            FROM Table1
            ORDER BY 1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,'')

SET @sql = 'SELECT TimeSeconds, ' + @cols + '
              FROM
            (
              SELECT TimeSeconds, TagID, Value
                FROM table1
            ) s
            PIVOT
            (
              MAX(Value) FOR TagID IN (' + @cols + ')
            ) p'

EXECUTE(@sql)

Cette requête construit l'instruction PIVOT dynamique en fonction des valeurs TagID uniques dans la table.

Ces méthodes fournissent des solutions efficaces et personnalisables pour transposer des lignes en colonnes. dans SQL Server. En sélectionnant l'approche appropriée en fonction des caractéristiques des données et des exigences de performances, vous pouvez simplifier les tâches de manipulation des données et améliorer l'efficacité de l'exécution des requêtes.

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