Database
 sql >> Base de données >  >> RDS >> Database

Comprendre les instructions PIVOT, UNPIVOT et Reverse PIVOT

L'instruction PIVOT est utilisée pour convertir les lignes du tableau en colonnes, tandis que l'opérateur UNPIVOT reconvertit les colonnes en lignes. L'inversion d'une instruction PIVOT fait référence au processus d'application de l'opérateur UNPIVOT à l'ensemble de données déjà PIVOT afin de récupérer l'ensemble de données d'origine.

Dans cet article, nous allons étudier ces trois notions sur différents exemples.

Opérateur PIVOT

Comme mentionné précédemment, l'opérateur PIVOT convertit les lignes du tableau en colonnes. Par exemple, si vous avez un tableau qui ressemble à ceci :

et faites-le pivoter par la troisième colonne, le résultat sera le suivant :

Dans le tableau d'origine, nous avions deux valeurs uniques pour les colonnes Cours - Anglais et Histoire. Dans le tableau croisé dynamique, ces valeurs uniques ont été converties en colonnes. Vous pouvez voir que les valeurs de score pour chaque nouvelle colonne restent inchangées. Par exemple, dans le tableau d'origine, une étudiante, Sally, avait obtenu 95 en anglais, contrairement aux valeurs du tableau croisé dynamique.

Comme toujours, assurez-vous d'effectuer une sauvegarde sécurisée avant d'apporter des modifications à une base de données en direct.

Regardons cet exemple d'utilisation de l'opérateur PIVOT dans SQL Server.

CREATE DATABASE School
GO

USE School
GO

CREATE TABLE Students
(
	Id INT PRIMARY KEY IDENTITY,
	StudentName VARCHAR (50),
	Course VARCHAR (50),
	Score INT
)
GO

INSERT INTO Students VALUES ('Sally', 'English', 95 )
INSERT INTO Students VALUES ('Sally', 'History', 82)
INSERT INTO Students VALUES ('Edward', 'English', 45)
INSERT INTO Students VALUES ('Edward', 'History', 78)

Le script ci-dessus crée la base de données School. Dans la base de données, nous créons la table Students avec quatre colonnes, telles que Id, StudentName, Course et Score. Enfin, nous ajoutons les quatre enregistrements fictifs à la table Étudiants.

Maintenant, si vous utilisez une instruction SELECT pour récupérer tous les enregistrements, vous verrez ce qui suit :

Faisons PIVOTER ce tableau par la colonne Cours. Pour cela, exécutez le script suivant :

SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot

Voyons ce qui se passe dans le script. Dans la première ligne, nous utilisons l'instruction SELECT pour définir les colonnes que nous voulons ajouter au tableau croisé dynamique. Les deux premières colonnes sont StudentName et Score. Les données de ces deux colonnes proviendront directement de la table des étudiants. La troisième colonne est Cours. Nous voulons PIVOTER notre table par la colonne Cours, par conséquent, la colonne Cours sera divisée en un nombre de colonnes égal aux valeurs spécifiées par l'opérateur PIVOT pour la colonne Cours.

La syntaxe de l'opérateur PIVOT est simple. Tout d'abord, vous devez appliquer une fonction d'agrégation à la colonne dont vous souhaitez afficher les valeurs dans les colonnes pivotées. Dans notre cas, nous voulons afficher Score dans les colonnes pivotées - Anglais et Histoire. Enfin, nous utilisons une instruction FOR pour spécifier la colonne pivot et les valeurs uniques qu'elle contient. Le résultat ressemble à ceci :

Opérateur UNPIVOT

L'opérateur UNPIVOT est utilisé pour convertir les colonnes d'un tableau en lignes. Par exemple, si vous avez un tableau qui ressemble à ceci :

L'opérateur UNPIVOT renverra les résultats suivants :

Les colonnes du tableau d'origine ont été converties en lignes du tableau non croisé. Utilisons ces données pour voir comment l'opérateur UNPIVOT fonctionne en SQL.

Pour cela, exécutez le script suivant :

CREATE DATABASE School2
GO

USE School2
GO

CREATE TABLE Students
(
	Id INT PRIMARY KEY IDENTITY,
	StudentName VARCHAR (50),
	Math INT,
	English INT,
	History INT,
	Science INT
)
GO

INSERT INTO Students VALUES ('Sally', 78, 85, 91, 76 )
INSERT INTO Students VALUES ('Edward', 87, 90, 82, 87)

Si vous sélectionnez les données de la table Students de la base de données School2, vous verrez les résultats suivants :

Pour appliquer l'opérateur UNPIVOT à cette table, exécutez la requête suivante :

SELECT StudentName, Course, Score
FROM Students
UNPIVOT
(
	Score
	FOR Course in (Math, English, History, Science)
) AS SchoolUnpivot

La syntaxe de l'opérateur UNPIVOT est similaire à celle de PIVOT. Dans l'instruction SELECT, vous devez spécifier les colonnes que vous souhaitez ajouter à la table de sortie. Dans l'instruction UNPIVOT, vous spécifierez deux colonnes :

  1. La première colonne contient les valeurs des lignes des colonnes pivotées (qui est Score dans ce cas).
  2. La deuxième colonne comprend les noms des colonnes pivotées, c'est-à-dire Mathématiques, Anglais, Histoire et Sciences.

La table de sortie ressemblera à ceci :

Inverser un PIVOT

L'inversion d'un opérateur PIVOT fait référence au processus d'application de l'opérateur UNPIVOT à une table pivotée afin de revenir à la table d'origine.

Inverser le tableau croisé dynamique non agrégé

L'inversion d'un opérateur PIVOT n'est possible que si le tableau croisé dynamique ne contient pas de données agrégées.

Regardons le tableau que nous avons utilisé dans la section PIVOT de cet article.

Vous pouvez voir qu'il n'y a pas de lignes répétées. En d'autres termes, on peut dire que pour chaque élève, il n'y a qu'un seul enregistrement par cours. Par exemple, Sally n'a qu'un seul enregistrement pour son score dans le cours d'anglais.

Lorsque nous avons appliqué l'opérateur PIVOT au tableau ci-dessus, nous avons obtenu le résultat suivant :

Maintenant, nous allons appliquer l'opérateur UNPIVOT à ce résultat et voir si nous pouvons revenir à la table d'origine. Pour cela, exécutez le script suivant :

Remarque :

Nous pouvons exécuter cette requête sur la base de données de l'école que nous avons créée dans la section Opérateur PIVOT.

SELECT StudentName, Course, Score
FROM
(SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot) PivotedResults
UNPIVOT
(
	Score
	FOR Course in (English, History)
) AS Schoolunpivot

Ici, nous utilisons une sous-requête pour appliquer l'opérateur UNPIVOT aux données pivotées. La requête interne utilise l'opérateur PIVOT, tandis que la requête externe utilise l'opérateur UNPIVOT. À la sortie, vous verrez la table Étudiants d'origine.

Inverser le tableau croisé dynamique agrégé

Nous avons dit précédemment qu'il n'est possible d'inverser qu'un opérateur PIVOT qui ne contient pas de données agrégées. Essayons d'inverser l'instruction PIVOT qui contient des données agrégées.

Ajoutez un autre enregistrement à la table Students de la base de données School que nous avons créée dans la première section de cet article. Pour cela, exécutez la requête suivante :

INSERT INTO Students VALUES ('Edward', 'History', 78)

Maintenant, si vous sélectionnez tous les enregistrements de la table Élèves, vous obtiendrez le résultat suivant :

Nous pouvons voir que nous avons un enregistrement en double pour la partition d'Edward dans l'Histoire.

Maintenant, appliquez l'opérateur PIVOT à cette table.

SELECT Id, StudentName, English, History
FROM Students
PIVOT
(
	SUM (Score)
	FOR Course in (English, History)
) AS Schoolpivot

À partir de la sortie, vous pouvez voir que la fonction SUM dans l'opérateur PIVOT a ajouté deux scores au cours d'histoire suivi par Edward. Si vous essayez d'inverser le pivot de cette table (c'est-à-dire d'appliquer l'opérateur UNPIVOT), vous ne recevrez pas la table d'origine. Il renverra les quatre enregistrements au lieu des cinq originaux. La colonne Historique de l'élève Edward contiendra le résultat agrégé plutôt que les résultats individuels.

Pour le voir, exécutez le script suivant :

SELECT StudentName, Course, Score
FROM
(SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot) PivotedResults
UNPIVOT
(
	Score
	FOR Course in (English, History)
) AS Schoolunpivot

La table de sortie ressemblera à ceci :

Références :

  • Microsoft :Utilisation de PIVOT et UNPIVOT
  • Codingsight :Utiliser PIVOT dans SQL
  • YouTube :Inverser la vidéo PIVOT