sql >> Database >  >> RDS >> Mysql

Hoe maak je een draaitabel in MySQL

Draaitabellen zijn handig voor gegevensanalyse, zodat u rijwaarden als kolommen kunt weergeven om eenvoudig inzicht te krijgen. Er is echter geen functie om een ​​draaitabel te maken in MySQL. U moet dus een SQL-query schrijven om een ​​draaitabel in MySQL te maken. Gelukkig zijn er veel manieren om een ​​draaitabel te maken in MySQL. Laten we ze allemaal snel bekijken.

Hoe maak je een draaitabel in MySQL

Hier zijn de stappen om een ​​draaitabel in MySQL te maken. Stel dat u de volgende tabel heeft

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


Stel dat u de tabel wilt draaien met examen kolom om 1 rij voor elke student en 1 kolom voor elk examen te maken, zoals hieronder weergegeven.

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

U kunt een draaitabel maken in MySQL met behulp van de IF- of CASE-instructie.

Lees bonus: Hoe de mediaan te berekenen in MySQL

Maak draaitabel in MySQL met behulp van IF-statement

Hier is de SQL-query die rijen naar kolommen transponeert met behulp van de IF-instructie.

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

In de bovenstaande zoekopdracht moet u groeperen op naam kolom, aangezien u voor elke leerling 1 rij wilt. U moet ook 1 voorwaarde opgeven voor elke kolom die u moet maken, dat wil zeggen, 1 voorwaarde voor elk examen

Maak draaitabel in MySQL met behulp van CASE-instructie

Hier is de SQL-query om rijen naar kolommen te converteren met behulp van de CASE-instructie.

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

De bovenstaande query werkt vergelijkbaar met de query die de bovenstaande IF-voorwaarde gebruikt. U moet groeperen op de kolom waarmee u uw gegevens wilt laten draaien, dat wil zeggen naam . U moet ook voor elk examennummer 1 CASE-instructie definiëren, aangezien u voor elk onderzoek afzonderlijke kolommen wilt maken.

U kunt ook examenscores combineren in uw draaitabel. Als u bijvoorbeeld scores van examen1 en examen2 wilt optellen en ze in dezelfde kolom wilt weergeven, kunt u de volgende query gebruiken.

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

In de bovenstaande tabel zijn de scores van examen 1 en examen 2 toegevoegd en weergegeven in een enkele kolom examen12, door simpelweg de voorwaarde van de 1e CASE-instructie te wijzigen en de 2e CASE-instructie te verwijderen.

U kunt de bovenstaande query's aanpassen aan uw vereisten om een ​​draaitabel in MySQL te maken. U kunt ook een rapportagetool gebruiken om het resultaat in een tabel te plotten. Hier is een voorbeeld van een tabel gemaakt met Ubiq.

Wist je dat je draaitabellen in Ubiq kunt maken door gewoon te slepen en neer te zetten?

Als u draaitabellen, grafieken en dashboards wilt maken vanuit de MySQL-database, kunt u Ubiq proberen. We bieden een gratis proefperiode van 14 dagen aan.

  1. Voeg bitsgewijze-OF toe in een subquery

  2. Hoe een reeks te maken als deze niet bestaat

  3. Hoe een MySQL-database back-uppen en herstellen?

  4. SELECT max(x) retourneert null; hoe kan ik ervoor zorgen dat het 0 teruggeeft?