sql >> Databáze >  >> RDS >> Mysql

Jak vytvořit kontingenční tabulku v MySQL

Kontingenční tabulky jsou užitečné pro analýzu dat, umožňují vám zobrazit hodnoty řádků jako sloupce, abyste mohli snadno získat statistiky. V MySQL však neexistuje žádná funkce pro vytvoření kontingenční tabulky. Chcete-li vytvořit kontingenční tabulku v MySQL, musíte napsat dotaz SQL. Naštěstí existuje mnoho způsobů, jak vytvořit kontingenční tabulku v MySQL. Pojďme se rychle podívat na každou z nich.

Jak vytvořit kontingenční tabulku v MySQL

Zde jsou kroky k vytvoření kontingenční tabulky v MySQL. Řekněme, že máte následující tabulku

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


Řekněme, že chcete tabulku otočit podle zkoušky sloupec tak, aby se vytvořil 1 řádek pro každého studenta a 1 sloupec pro každou zkoušku, jak je uvedeno níže.

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

Kontingenční tabulku v MySQL můžete vytvořit pomocí příkazu IF nebo CASE.

Bonusové čtení: Jak vypočítat medián v MySQL

Vytvoření kontingenční tabulky v MySQL pomocí příkazu IF

Zde je dotaz SQL transponující řádky do sloupců pomocí příkazu 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     |
+--------+-----------+-----------+-----------+------------+

Ve výše uvedeném dotazu je třeba seskupit podle jméno sloupec, protože chcete 1 řádek pro každého studenta. Také musíte zadat 1 podmínku pro každý sloupec, který potřebujete vytvořit, tj. 1 podmínku pro každou zkoušku

Vytvoření kontingenční tabulky v MySQL pomocí příkazu CASE

Zde je dotaz SQL pro převod řádků na sloupce pomocí příkazu 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     |
+--------+-----------+-----------+-----------+------------+

Výše uvedený dotaz funguje podobně jako dotaz, který používá podmínku IF výše. Musíte seskupit podle sloupce, podle kterého chcete svá data seřadit, tedy název . Také musíte definovat 1 příkaz CASE pro každé číslo zkoušky, protože chcete pro každou zkoušku vytvořit samostatné sloupce.

Ve své kontingenční tabulce můžete také kombinovat skóre zkoušek. Chcete-li například sečíst skóre zkoušek 1 a 2 a zobrazit je ve stejném sloupci, můžete použít následující dotaz.

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

Ve výše uvedené tabulce bylo skóre zkoušky 1 a zkoušky 2 přidáno a zobrazeno v jediném sloupci zkouška12, a to jednoduchou úpravou podmínky 1. příkazu CASE a odstraněním příkazu 2. CASE.

Výše uvedené dotazy můžete přizpůsobit podle svého požadavku na vytvoření kontingenční tabulky v MySQL. K vykreslení výsledku do tabulky můžete také použít nástroj pro vytváření sestav. Zde je příklad tabulky vytvořené pomocí Ubiq.

Věděli jste, že v Ubiq můžete vytvářet kontingenční tabulky pouhým přetažením?

Pokud chcete vytvářet kontingenční tabulky, grafy a dashboardy z databáze MySQL, můžete zkusit Ubiq. Nabízíme 14denní bezplatnou zkušební verzi.

  1. Jak vytvořit pohled v SQL

  2. MySQL - výběr dat z databáze mezi dvěma daty

  3. Proč jsou hodnoty NULL na prvním místě při objednávání DESC v dotazu PostgreSQL?

  4. Jak vytvořit dotaz s group_concat na serveru SQL