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.