kontingenčná tabuľka v MySQL
Čo je kontingečná tabuľka (pivot table, RC table), vieme všetci, pretože to využívame v Exceli .>). Ako na ňu v MySQL?
Užívať sa budú len štandardné SQL konštrukcie a ziadne aplikačné nadstavby – na CLI pomocou klienta mysql. Aby so to nedemonštroval na nejakých sterilných podivuhodnostiach typu farba čapíc a pohlavie ich nositeľov, zostavím si reálnu tabuľku z každodennej praxe:
- SJ (stratigrafické jednotky) sú tri druhy – depozit, negativ a štruktúra
- každá SJ može byť dokumentovaná nálsedovným technickým inštrumentáriom: geodetickým meraním, výkresovo, fotogrametricky, skicou a ničím (nedefinovana).
Cieľom kontingenčnej tabuľky by bolo v reále napr zistiť potenciálne závislosti medzi typom SJ a a preferovaným spôsobom dokumentácie. Ako však technicky zostaviť dotaz na vytvorenie kontingenčnej tabuľky?
1. Vytvorenie tabuľky a import dát
Data som naloadoval do jednej tabuľky a v prípade, že by si ich chcel niekto skúsiť, tak tu pivot_table_MySQL (štruktúra tabuľky i data).
2. Kontingenčná tabuľka
Klúčovými príkazmi DML sú ORDER BY a SUM.
SELECT typ_sj,
SUM(IF(SJ_dok.dokumentacia=”geodezia”, 1, 0)) AS geodézia,
SUM(IF(SJ_dok.dokumentacia=”vykres”, 1, 0)) AS výkres,
SUM(IF(SJ_dok.dokumentacia=”fotogrammetria”, 1, 0)) AS fotogrammetria,
SUM(IF(SJ_dok.dokumentacia=”skica”, 1, 0)) AS skicovanie,
SUM(IF(SJ_dok.dokumentacia=”nedefinovane”, 1, 0)) AS nedefinované,
COUNT(*)
FROM SJ_dok
GROUP BY typ_sj
;
3. Pokec
Príkaz je pomerne jednoduchý, zložitejšia konštrukcia je len to sumovanie v SELECTe. To je aj jediná slabosť konštruktu:
- je nutné na začiatku vedieť, koľko typov má dokumentácia (rozsah poľa; všimni te si, že typ bol nastavený na ENUM)
- pokiaľ by malo pole s typom dokumentácie vysokú kardinalitu, skript by bol rozsiahly