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

Comment créer un tableau croisé dynamique dans MySQL

Les tableaux croisés dynamiques sont utiles pour l'analyse des données. Ils vous permettent d'afficher les valeurs des lignes sous forme de colonnes pour obtenir facilement des informations. Cependant, il n'y a pas de fonction pour créer un tableau croisé dynamique dans MySQL. Vous devez donc écrire une requête SQL pour créer un tableau croisé dynamique dans MySQL. Heureusement, il existe de nombreuses façons de créer un tableau croisé dynamique dans MySQL. Examinons chacun d'eux rapidement.

Comment créer un tableau croisé dynamique dans MySQL

Voici les étapes pour créer un tableau croisé dynamique dans MySQL. Disons que vous avez le tableau suivant

CREATE TABLE exams (
id int(11) NOT NULL auto_increment,
name varchar(15),
exam int,
score int,
PRIMARY KEY (id)
);

insert into exams (name,exam,score) values ('Bob',1,70);
insert into exams (name,exam,score) values ('Bob',2,77);
insert into exams (name,exam,score) values ('Bob',3,71);
insert into exams (name,exam,score) values ('Bob',4,70);

insert into exams (name,exam,score) values ('Sue',1,89);
insert into exams (name,exam,score) values ('Sue',2,87);
insert into exams (name,exam,score) values ('Sue',3,88);
insert into exams (name,exam,score) values ('Sue',4,89);

mysql> select * from exams;
+------+------+------+-------+
| id   | name | exam | score |
+------+------+------+-------+
|   1  |  Bob |   1  |   70  |
|   2  |  Bob |   2  |   77  |
|   3  |  Bob |   3  |   71  |
|   4  |  Bob |   4  |   70  |
|   5  |  Sue |   1  |   89  |
|   6  |  Sue |   2  |   87  |
|   7  |  Sue |   3  |   88  |
|   8  |  Sue |   4  |   89  |
+------+------+------+-------+


Supposons que vous souhaitiez faire pivoter le tableau par examen colonne afin de créer 1 ligne pour chaque étudiant et 1 colonne pour chaque examen, comme indiqué ci-dessous.

+--------+-----------+-----------+-----------+------------+
|   name |    exam1  |    exam2  |    exam3  |    exam4   |
+--------+-----------+-----------+-----------+------------+
|   Bob  |     70    |     77    |     71    |     70     |
|   Sue  |     89    |     87    |     88    |     89     |
+--------+-----------+-----------+-----------+------------+

Vous pouvez créer un tableau croisé dynamique dans MySQL à l'aide de l'instruction IF ou CASE.

Lecture bonus : Comment calculer la médiane dans MySQL

Créer un tableau croisé dynamique dans MySQL à l'aide de l'instruction IF

Voici la requête SQL transposant les lignes en colonnes à l'aide de l'instruction IF.

SELECT name,
sum(IF(exam=1, score, NULL)) AS exam1,
sum(IF(exam=2, score, NULL)) AS exam2,
sum(IF(exam=3, score, NULL)) AS exam3,
sum(IF(exam=4, score, NULL)) AS exam4
FROM exams
GROUP BY name;
+--------+-----------+-----------+-----------+------------+
|   name |    exam1  |    exam2  |    exam3  |    exam4   |
+--------+-----------+-----------+-----------+------------+
|   Bob  |     70    |     77    |     71    |     70     |
|   Sue  |     89    |     87    |     88    |     89     |
+--------+-----------+-----------+-----------+------------+

Dans la requête ci-dessus, vous devez regrouper par nom colonne puisque vous voulez 1 ligne pour chaque étudiant. De plus, vous devez fournir 1 condition pour chaque colonne que vous devez créer, c'est-à-dire 1 condition pour chaque examen

Créer un tableau croisé dynamique dans MySQL à l'aide de l'instruction CASE

Voici la requête SQL pour convertir des lignes en colonnes à l'aide de l'instruction CASE.

SELECT name,
sum(CASE WHEN exam=1 THEN score ELSE NULL END) AS exam1,
sum(CASE WHEN exam=2 THEN score ELSE NULL END) AS exam2,
sum(CASE WHEN exam=3 THEN score ELSE NULL END) AS exam3,
sum(CASE WHEN exam=4 THEN score ELSE NULL END) AS exam4
FROM exams
GROUP BY name;
+--------+-----------+-----------+-----------+------------+
|   name |    exam1  |    exam2  |    exam3  |    exam4   |
+--------+-----------+-----------+-----------+------------+
|   Bob  |     70    |     77    |     71    |     70     |
|   Sue  |     89    |     87    |     88    |     89     |
+--------+-----------+-----------+-----------+------------+

La requête ci-dessus fonctionne de manière similaire à celle qui utilise la condition IF ci-dessus. Vous devez regrouper par la colonne par laquelle vous souhaitez faire pivoter vos données, c'est-à-dire nom . De plus, vous devez définir 1 instruction CASE pour chaque numéro d'examen puisque vous souhaitez créer des colonnes distinctes pour chaque examen.

Vous pouvez également combiner les résultats des examens dans votre tableau croisé dynamique. Par exemple, si vous souhaitez additionner les notes de l'examen1 et de l'examen2 et les afficher dans la même colonne, vous pouvez utiliser la requête suivante.

SELECT name,
sum(CASE WHEN exam=1 or exam=2 THEN score ELSE NULL END) AS exam12,
sum(CASE WHEN exam=3 THEN score ELSE NULL END) AS exam3,
sum(CASE WHEN exam=4 THEN score ELSE NULL END) AS exam4
FROM exams
GROUP BY name;
+--------+------------+-----------+-----------+------------+
|   name |    exam12  |    exam2  |    exam3  |    exam4   |
+--------+------------+-----------+-----------+------------+
|   Bob  |     147    |     77    |     71    |     70     |
|   Sue  |     176    |     87    |     88    |     89     |
+--------+------------+-----------+-----------+------------+

Dans le tableau ci-dessus, les scores de l'examen 1 et de l'examen 2 ont été ajoutés et affichés dans une seule colonne exam12, en modifiant simplement la condition du 1er énoncé CASE et en supprimant le 2e énoncé CASE.

Vous pouvez personnaliser les requêtes ci-dessus selon vos besoins pour créer un tableau croisé dynamique dans MySQL. Vous pouvez également utiliser un outil de génération de rapports pour tracer le résultat dans un tableau. Voici un exemple de tableau créé avec Ubiq.

Saviez-vous que vous pouvez créer des tableaux croisés dynamiques dans Ubiq par simple glisser-déposer ?

Si vous souhaitez créer des tableaux croisés dynamiques, des graphiques et des tableaux de bord à partir de la base de données MySQL, vous pouvez essayer Ubiq. Nous offrons un essai gratuit de 14 jours.