MySQL Pivot: otáčanie riadkov do stĺpcov

Mysql Pivot Rotating Rows Columns



Databázová tabuľka môže ukladať rôzne typy údajov a niekedy potrebujeme transformovať údaje na úrovni riadkov na údaje na úrovni stĺpcov. Tento problém je možné vyriešiť pomocou funkcie PIVOT (). Táto funkcia sa používa na otáčanie riadkov tabuľky na hodnoty stĺpcov. Túto funkciu však podporuje veľmi málo databázových serverov, ako napríklad Oracle alebo SQL Server. Ak chcete vykonať rovnakú úlohu v databázovej tabuľke MySQL, musíte napísať príkaz SELECT na príkaz CASE a otočiť riadky do stĺpcov. Tento článok ukazuje spôsob vykonania úlohy funkcie PIVOT () v rámci súvisiacich databázových tabuliek MySQL.

Predpoklad:

Musíte vytvoriť databázu a niektoré súvisiace tabuľky, kde budú riadky jednej tabuľky prevedené do stĺpcov ako funkcia PIVOT (). Spustením nasledujúcich príkazov SQL vytvorte databázu s názvom „ unidb “A vytvorte tri tabuľky s názvom„ študenti “,„ kurzy “A„ výsledok '. študenti a výsledok tabuľky budú prepojené vzťahom jedna k mnohým a kurzy a výsledky Tu budú tabuľky prepojené vzťahom jedna k mnohým. VYTVORIŤ vyhlásenie spoločnosti výsledok tabuľka obsahuje dve obmedzenia cudzích kľúčov pre polia, std_id a course_id .







VYTVORIŤ DATABÁZU unidb;
POUŽIŤ unidb;

VYTVORIŤ TABUĽKU študenti(
idVNÚTORNÝ PRIMÁRNY KĽÚČ,
meno varchar(päťdesiat)NIE NULL,
oddelenie VARCHAR(pätnásť)NIE NULL);

VYTVORTE kurzy TABUĽKY(
course_id VARCHAR(dvadsať)PRIMÁRNY KĽÚČ,
meno varchar(päťdesiat)NIE NULL,
kredit SMALLINT NIE JE NULOVÝ);

CREATE TABLE výsledok(
std_id INT NOT NULL,
course_id VARCHAR(dvadsať)NIE NULL,
typ_značky VARCHAR(dvadsať)NIE NULL,
označí SMALLINT NIE NULL,
CUDZÍ KĽÚČ(std_id)LITERATÚRA študenti(id),
CUDZÍ KĽÚČ(course_id)REFERENČNÉ kurzy(course_id),
PRIMÁRNY KĽÚČ(std_id, course_id, mark_type));

Vložte nejaké záznamy do študenti, kurzy a výsledok stoly. Hodnoty je potrebné vložiť do tabuliek na základe obmedzení stanovených v čase vytvárania tabuľky.



VLOŽTE DO HODNOTY študentov
( „1937463“,„Harper Lee“,„VVN“),
( „1937464“,Garcia Marquez,„VVN“),
( „1937465“,„Forster, E.M.“,„VVN“),
( „1937466“,„Ralph Ellison“,„VVN“);

VLOŽTE DO HODNOTY kurzov
( „CSE-401“,'Objektovo orientované programovanie',3),
( „CSE-403“,'Dátová štruktúra',2),
( „CSE-407“,„Unixové programovanie“,2);

VLOŽTE DO HODNOTY výsledku
( „1937463“,„CSE-401“,„Interná skúška“,pätnásť),
( „1937463“,„CSE-401“,„Strednodobá skúška“,dvadsať),
( „1937463“,„CSE-401“,'Záverečná skúška',35),
( „1937464“,„CSE-403“,„Interná skúška“,17),
( „1937464“,„CSE-403“,„Strednodobá skúška“,pätnásť),
( „1937464“,„CSE-403“,'Záverečná skúška',30),
( „1937465“,„CSE-401“,„Interná skúška“,18),
( „1937465“,„CSE-401“,„Strednodobá skúška“,2. 3),
( „1937465“,„CSE-401“,'Záverečná skúška',38),
( „1937466“,„CSE-407“,„Interná skúška“,dvadsať),
( „1937466“,„CSE-407“,„Strednodobá skúška“,22),
( „1937466“,„CSE-407“,'Záverečná skúška',40);

Tu, výsledok tabuľka obsahuje viacero rovnakých hodnôt pre std_id , typ_značky a course_id stĺpce v každom riadku. Ako previesť tieto riadky do stĺpcov tejto tabuľky na zobrazenie údajov v organizovanejšom formáte je uvedené v ďalšej časti tohto tutoriálu.



Otočte riadky do stĺpcov pomocou príkazu CASE:

Spustením nasledujúceho jednoduchého príkazu SELECT zobrazíte všetky záznamy súboru výsledok stôl.





VYBERTE*FROM výsledok;

Výstup zobrazuje štyri známky študentov pre tri typy skúšok z troch kurzov. Takže hodnoty std_id , course_id a typ_značky sa opakujú viackrát pre rôznych študentov, kurzy a typy skúšok.



Výstup bude čitateľnejší, ak bude dotaz SELECT možné napísať efektívnejšie pomocou príkazu CASE. Nasledujúci príkaz SELECT s príkazom CASE transformuje opakujúce sa hodnoty riadkov na názvy stĺpcov a zobrazí obsah tabuliek v zrozumiteľnejšom formáte pre používateľa.

VYBRAŤ result.std_id, result.course_id,
MAX(PRÍPAD, KEDY result.mark_type =„Interná skúška“POTOM výsledok.značky KONIEC) „Interná skúška“,
MAX(PRÍPAD, KEDY result.mark_type =„Strednodobá skúška“POTOM výsledok.značky KONIEC) „Strednodobá skúška“,
MAX(PRÍPAD, KEDY result.mark_type ='Záverečná skúška'POTOM výsledok.značky KONIEC) 'Záverečná skúška'
FROM výsledok
SKUPINA PODĽA result.std_id, result.course_id
OBJEDNAŤ BY result.std_id, result.course_id ASC;

Nasledujúci výstup sa objaví po spustení vyššie uvedeného príkazu, ktorý je čitateľnejší ako predchádzajúci výstup.

Otočte riadky do stĺpcov pomocou CASE a SUM ():

Ak chcete z tabuľky spočítať celkový počet každého kurzu každého študenta, musíte použiť súhrnnú funkciu SUM () zoskupiť podľa std_id a course_id s vyhlásením CASE. Nasledujúci dotaz je vytvorený úpravou predchádzajúceho dotazu pomocou funkcie SUM () a klauzuly GROUP BY.

VYBRAŤ result.std_id, result.course_id,
MAX(PRÍPAD, KEDY result.mark_type =„Interná skúška“POTOM výsledok.značky KONIEC) „Interná skúška“,
MAX(PRÍPAD, KEDY result.mark_type =„Strednodobá skúška“POTOM výsledok.značky KONIEC) „Strednodobá skúška“,
MAX(PRÍPAD, KEDY result.mark_type ='Záverečná skúška'POTOM výsledok.značky KONIEC) 'Záverečná skúška',
SÚČET(výsledok.značky) akoCelkom
FROM výsledok
SKUPINA PODĽA result.std_id, result.course_id
OBJEDNAŤ BY result.std_id, result.course_id ASC;

Výstupom je nový stĺpec s názvom Celkom ktorý zobrazuje súčet známok všetkých typov skúšok každého kurzu, ktoré získal každý konkrétny študent.

Otočiť riadky do stĺpcov vo viacerých tabuľkách:

Predchádzajúce dva dotazy sa použijú na súbor výsledok stôl. Táto tabuľka súvisí s ďalšími dvoma tabuľkami. Toto sú študenti a kurzy . Ak chcete namiesto ID študenta zobraziť meno študenta a namiesto názvu kurzu názov kurzu, musíte napísať dotaz SELECT pomocou troch súvisiacich tabuliek, študenti , kurzy a výsledok . Nasledujúci dotaz SELECT sa vytvorí pridaním troch názvov tabuliek za klauzulu FORM a nastavením vhodných podmienok v klauzule WHERE na získanie údajov z troch tabuliek a vygenerovanie vhodnejšieho výstupu ako predchádzajúce dotazy SELECT.

VYBRAŤ študentov.názovako Meno študenta, kurzy.názovako Názov kurzu,
MAX(PRÍPAD, KEDY result.mark_type =„Interná skúška“POTOM výsledok.značky KONIEC) „CT“,
MAX(PRÍPAD, KEDY result.mark_type =„Strednodobá skúška“POTOM výsledok.značky KONIEC) 'Mid',
MAX(PRÍPAD, KEDY result.mark_type ='Záverečná skúška'POTOM výsledok.značky KONIEC) 'Finálny',
SÚČET(výsledok.značky) akoCelkom
OD študentov, kurzy, výsledok
WHERE result.std_id = students.id a result.course_id = courses.course_id
SKUPINA PODĽA result.std_id, result.course_id
OBJEDNAŤ BY result.std_id, result.course_id ASC;

Nasledujúci výstup sa vygeneruje po vykonaní vyššie uvedeného dotazu.

Záver:

Ako môžete implementovať funkčnosť funkcie Pivot () bez podpory funkcie Pivot () v MySQL, je uvedené v tomto článku pomocou niektorých fiktívnych údajov. Dúfam, že po prečítaní tohto článku budú čitatelia schopní transformovať údaje na úrovni riadkov na údaje na úrovni stĺpcov pomocou dotazu SELECT.