MySQL Pivot: ridade pööramine veergudeks

Mysql Pivot Rotating Rows Columns



Andmebaasi tabelisse saab salvestada erinevat tüüpi andmeid ja mõnikord peame muutma rea ​​taseme andmed veergutasemel andmeteks. Selle probleemi saab lahendada funktsiooni PIVOT () abil. Seda funktsiooni kasutatakse tabeli ridade veergudeks pööramiseks. Kuid seda funktsiooni toetavad väga vähesed andmebaasiserverid, näiteks Oracle või SQL Server. Kui soovite sama ülesannet täita MySQL -i andmebaasi tabelis, peate ridade veergudeks pööramiseks kirjutama SELECT -päringu CASE -lause abil. Artiklis näidatakse, kuidas funktsiooni PIVOT () ülesannet täita seotud MySQL -i andmebaasi tabelites.

Eeltingimus:

Peate looma andmebaasi ja mõned seotud tabelid, kus ühe tabeli read muudetakse veergudeks, nagu funktsioon PIVOT (). Käivitage järgmised SQL -laused andmebaasi nimega „ unidb 'Ja looge kolm tabelit nimega' õpilased ',' kursused 'Ja' tulemus '. õpilased ja tulemus tabeleid seostab üks-mitmele suhe ja kursused ja tulemused tabeleid seostatakse siin ühe-mitme suhtega. CREATE avaldus tulemus tabel sisaldab väljade jaoks kahte võõrpiirangut, std_id ja muidugi_id .







CATATE DATABASE unidb;
USE unidb;

LOOTA LAUD õpilased(
idESIMENE VÕTME,
nimi varchar(viiskümmend)EI NULL,
osakond VARCHAR(viisteist)MITTE NULL);

LOO LAUA kursused(
course_id VARCHAR(kakskümmend)Esmane võti,
nimi varchar(viiskümmend)EI NULL,
krediit SMALLINT EI OLE NULL);

CREATE TABLE tulemus(
std_id INT EI OLE NULL,
course_id VARCHAR(kakskümmend)EI NULL,
mark_type VARCHAR(kakskümmend)EI NULL,
märgib SMALLINT NOT NULL,
VÄLISVÕTI(std_id)Viited õpilastele(id),
VÄLISVÕTI(muidugi_id)VÄLJAKUTSED kursused(muidugi_id),
ESIMENE VÕTTE(std_id, course_id, mark_type));

Sisestage mõned kirjed üliõpilased, kursused ja tulemus tabelid. Väärtused tuleb tabelitesse sisestada vastavalt tabeli loomise ajal seatud piirangutele.



SISESTA õpilastele VÄÄRTUSED
( „1937463”,'Harper Lee',„CSE”),
( „1937464”,'Garcia Marquez',„CSE”),
( „1937465”,'Forster, E. M.',„CSE”),
( „1937466”,'Ralph Ellison',„CSE”);

INSERT INTO kursused VÄÄRTUSED
( „CSE-401”,'Objektile orienteeritud programmeerimine',3),
( „CSE-403”,'Andmestruktuur',2),
( „CSE-407”,'Unixi programmeerimine',2);

INSERT INTO result VÄÄRTUSED
( „1937463”,„CSE-401”,'Siseeksam',viisteist),
( „1937463”,„CSE-401”,'Vaheeksam',kakskümmend),
( „1937463”,„CSE-401”,'Lõpueksam',35),
( „1937464”,„CSE-403”,'Siseeksam',17),
( „1937464”,„CSE-403”,'Vaheeksam',viisteist),
( „1937464”,„CSE-403”,'Lõpueksam',30),
( „1937465”,„CSE-401”,'Siseeksam',18),
( „1937465”,„CSE-401”,'Vaheeksam',2. 3),
( „1937465”,„CSE-401”,'Lõpueksam',38),
( „1937466”,„CSE-407”,'Siseeksam',kakskümmend),
( „1937466”,„CSE-407”,'Vaheeksam',22),
( „1937466”,„CSE-407”,'Lõpueksam',40);

Siin, tulemus tabelis on mitu sama väärtust std_id , mark_type ja muidugi_id veerud igas reas. Kuidas neid ridu teisendada tabeli veergudeks, et kuvada andmeid korrastatumal kujul, on näidatud selle õpetuse järgmises osas.



Pöörake ridu veergudeks, kasutades CASE -lauset:

Kõigi kirjete kuvamiseks käivitage järgmine lihtne SELECT -lause tulemus tabel.





VALI*FROM tulemusest;

Väljund näitab nelja õpilase hindeid kolme kursuse kolme eksamitüübi kohta. Seega väärtused std_id , muidugi_id ja mark_type korduvad mitu korda erinevate õpilaste, kursuste ja eksamitüüpide jaoks.



Väljund on loetavam, kui SELECT -päringut saab CASE -lause abil tõhusamalt kirjutada. Järgmine SELECT koos CASE -lausega muudab ridade korduvad väärtused veerunimedeks ja kuvab tabelite sisu kasutajale arusaadavamas vormingus.

SELECT result.std_id, result.course_id,
MAX(CASE WHEN result.mark_type ='Siseeksam'SIIS tulemus.märgid LÕPP) 'Siseeksam',
MAX(CASE WHEN result.mark_type ='Vaheeksam'SIIS tulemus.märgid LÕPP) 'Vaheeksam',
MAX(CASE WHEN result.mark_type ='Lõpueksam'SIIS tulemus.märgid LÕPP) 'Lõpueksam'
FROM tulemusest
RÜHMITA tulemuse.std_id, result.course_id järgi
TELLI BY result.std_id, result.course_id ASC;

Pärast ülaltoodud avalduse käivitamist kuvatakse järgmine väljund, mis on loetavam kui eelmine väljund.

Pöörake ridu veergudeks, kasutades CASE ja SUM ():

Kui soovite tabelisse lugeda iga õpilase iga kursuse koguarvu, peate kasutama liitfunktsiooni SUM () rühmitada std_id ja muidugi_id koos CASE avaldusega. Järgmine päring luuakse, muutes eelmist päringut funktsiooni SUM () ja klausliga GROUP BY.

SELECT result.std_id, result.course_id,
MAX(CASE WHEN result.mark_type ='Siseeksam'SIIS tulemus.märgid LÕPP) 'Siseeksam',
MAX(CASE WHEN result.mark_type ='Vaheeksam'SIIS tulemus.märgid LÕPP) 'Vaheeksam',
MAX(CASE WHEN result.mark_type ='Lõpueksam'SIIS tulemus.märgid LÕPP) 'Lõpueksam',
SUM(tulemus.märgid) naguKokku
FROM tulemusest
RÜHMITA tulemuse.std_id, result.course_id järgi
TELLI BY result.std_id, result.course_id ASC;

Väljund näitab uut veergu nimega Kokku see näitab iga kursuse kõigi eksamitüüpide hinnete summat, mille iga õpilane on saanud.

Ridade pööramine mitme tabeli veergudeks:

Kaks eelmist päringut rakendatakse päringule tulemus tabel. See tabel on seotud ülejäänud kahe tabeliga. Need on õpilased ja kursused . Kui soovite kuvada õpilase ID asemel õpilase nime ja kursuse ID asemel kursuse nime, peate kirjutama päringu SELECT, kasutades kolme seotud tabelit, õpilased , kursused ja tulemus . Järgmine päring SELECT luuakse, lisades FORM klausli juurde kolm tabelinime ja seadistades WHERE klauslisse sobivad tingimused, et saada andmed kolmest tabelist ja luua sobivam väljund kui eelmistel SELECT päringutel.

VALI õpilased.niminagu ''Õpilase nimi'', kursused.niminagu ''Kursuse nimi'',
MAX(CASE WHEN result.mark_type ='Siseeksam'SIIS tulemus.märgid LÕPP) 'CT',
MAX(CASE WHEN result.mark_type ='Vaheeksam'SIIS tulemus.märgid LÕPP) 'Keskmine',
MAX(CASE WHEN result.mark_type ='Lõpueksam'SIIS tulemus.märgid LÕPP) 'Lõplik',
SUM(tulemus.märgid) naguKokku
Õpilastelt, kursused, tulemus
KUS result.std_id = õpilaste.id ja result.course_id = course.course_id
RÜHMITA tulemuse.std_id, result.course_id järgi
TELLI BY result.std_id, result.course_id ASC;

Pärast ülaltoodud päringu täitmist genereeritakse järgmine väljund.

Järeldus:

Kuidas rakendada funktsiooni Pivot () funktsionaalsust ilma MySQL -i funktsiooni Pivot () toeta, kuvatakse selles artiklis, kasutades mõningaid näivandmeid. Loodan, et lugejad saavad pärast käesoleva artikli lugemist päringu SELECT abil muuta kõik rea taseme andmed veerutaseme andmeteks.