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.