„MySQL Pivot“: eilučių sukimas į stulpelius

Mysql Pivot Rotating Rows Columns



Duomenų bazės lentelėje galima saugoti įvairių tipų duomenis, o kartais mums reikia eilutės lygio duomenis paversti stulpelio lygio duomenimis. Šią problemą galima išspręsti naudojant funkciją PIVOT (). Ši funkcija naudojama lentelės eilutes pasukti į stulpelių reikšmes. Tačiau šią funkciją palaiko labai nedaug duomenų bazių serverių, tokių kaip „Oracle“ ar „SQL Server“. Jei norite atlikti tą pačią užduotį „MySQL“ duomenų bazės lentelėje, turite parašyti SELECT užklausą naudodami CASE sakinį, kad eilutės būtų pasuktos į stulpelius. Straipsnyje parodyta, kaip atlikti PIVOT () funkcijos užduotį susijusiose „MySQL“ duomenų bazės lentelėse.

Būtina sąlyga:

Turite sukurti duomenų bazę ir kai kurias susijusias lenteles, kuriose vienos lentelės eilutės bus paverstos stulpeliais, pvz., PIVOT () funkcija. Vykdykite šiuos SQL sakinius, kad sukurtumėte duomenų bazę pavadinimu „ unidb “Ir sukurkite tris lenteles pavadinimu„ studentų “,„ kursus “Ir„ rezultatas “. studentų ir rezultatas lentelės bus susietos „vienas su daug“ ryšiu ir kursus ir rezultatus lentelės čia bus susietos vienas su daugeliu. KURTI pareiškimą rezultatas lentelėje yra du lauko raktų apribojimai, std_id , ir kurso_id .







CREATE DATABASE unidb;
USE unidb;

KURTI LENTELĘ mokiniai(
idPAGRINDINIS RAKTAS,
vardas varchar(penkiasdešimt)NE NULL,
skyrius VARCHAR(penkiolika)NE NULL);

KURTI LENTELĖS kursus(
course_id VARCHAR(dvidešimt)PAGRINDINIS RAKTAS,
vardas varchar(penkiasdešimt)NE NULL,
kreditas SMALLINT NOT NULL);

KURTI LENTELĖS rezultatą(
std_id INT NOT NULL,
course_id VARCHAR(dvidešimt)NE NULL,
mark_type VARCHAR(dvidešimt)NE NULL,
pažymi SMALLINT NOT NULL,
SVETIMAS RAKTAS(std_id)NUORODOS mokiniai(id),
SVETIMAS RAKTAS(kurso_id)NUORODOS kursai(kurso_id),
PAGRINDINIS RAKTAS(std_id, course_id, mark_type));

Įdėkite kai kuriuos įrašus studentai, kursai ir rezultatas stalai. Vertės turi būti įterpiamos į lenteles, atsižvelgiant į apribojimus, nustatytus lentelės kūrimo metu.



ĮDĖTI Į STUDIJUS VERTYBES
( „1937463“,„Harper Lee“,„TPV“),
( „1937464“,„Garcia Marquez“,„TPV“),
( „1937465“,„Forsteris, E. M.“,„TPV“),
( „1937466“,„Ralfas Elisonas“,„TPV“);

INSERT INTO kursai VERTYBĖS
( „CSE-401“,'Objektinis programavimas',3),
( „CSE-403“,„Duomenų struktūra“,2),
( „CSE-407“,„Unix programavimas“,2);

Įterpti į rezultato VERTES
( „1937463“,„CSE-401“,„Vidinis egzaminas“,penkiolika),
( „1937463“,„CSE-401“,„Tarpinis egzaminas“,dvidešimt),
( „1937463“,„CSE-401“,'Paskutinis egzaminas',35),
( „1937464“,„CSE-403“,„Vidinis egzaminas“,17),
( „1937464“,„CSE-403“,„Tarpinis egzaminas“,penkiolika),
( „1937464“,„CSE-403“,'Paskutinis egzaminas',30),
( „1937465“,„CSE-401“,„Vidinis egzaminas“,18),
( „1937465“,„CSE-401“,„Tarpinis egzaminas“,2. 3),
( „1937465“,„CSE-401“,'Paskutinis egzaminas',38),
( „1937466“,„CSE-407“,„Vidinis egzaminas“,dvidešimt),
( „1937466“,„CSE-407“,„Tarpinis egzaminas“,22),
( „1937466“,„CSE-407“,'Paskutinis egzaminas',40);

Čia, rezultatas lentelėje yra kelios tos pačios reikšmės std_id , mark_type ir kurso_id stulpelių kiekvienoje eilutėje. Kaip šias eilutes paversti šios lentelės stulpeliais, kad duomenys būtų rodomi labiau organizuotu formatu, parodyta kitoje šios pamokos dalyje.



Pasukite eilutes į stulpelius naudodami CASE sakinį:

Vykdykite šį paprastą SELECT sakinį, kad būtų rodomi visi rezultatas lentelę.





PASIRINKTI*IŠ rezultato;

Rezultatas rodo keturių studentų pažymius už trijų tipų trijų egzaminų tipus. Taigi vertybės std_id , kurso_id ir mark_type yra kartojami kelis kartus skirtingiems studentams, kursams ir egzaminų tipams.



Išvestis bus lengviau skaitoma, jei SELECT užklausą bus galima parašyti efektyviau naudojant CASE sakinį. Toliau pateiktas SELECT su CASE sakiniu pasikartojančias eilučių reikšmes pavers stulpelių pavadinimais ir vartotojui suprantamesniu formatu parodys lentelių turinį.

SELECT result.std_id, result.course_id,
MAX(CASE WHEN result.mark_type =„Vidinis egzaminas“TADA rezultatas.žymos PABAIGA) „Vidinis egzaminas“,
MAX(CASE WHEN result.mark_type =„Tarpinis egzaminas“TADA rezultatas.žymos PABAIGA) „Tarpinis egzaminas“,
MAX(CASE WHEN result.mark_type ='Paskutinis egzaminas'TADA rezultatas.žymos PABAIGA) 'Paskutinis egzaminas'
IŠ rezultato
GRUPĖ PAGAL rezultatą.std_id, result.course_id
UŽSAKYTI pagal rezultatą.std_id, result.course_id ASC;

Toliau pateikiama išvestis pasirodys paleidus aukščiau pateiktą teiginį, kuris yra labiau įskaitomas nei ankstesnis.

Pasukite eilutes į stulpelius naudodami CASE ir SUM ():

Jei norite iš lentelės suskaičiuoti bendrą kiekvieno studento kurso skaičių, turite naudoti agregavimo funkciją SUMA() Grupuoti pagal std_id ir kurso_id su CASE pareiškimu. Ši užklausa sukurta modifikuojant ankstesnę užklausą naudojant funkciją SUM () ir sąlygą GROUP BY.

SELECT result.std_id, result.course_id,
MAX(CASE WHEN result.mark_type =„Vidinis egzaminas“TADA rezultatas.žymos PABAIGA) „Vidinis egzaminas“,
MAX(CASE WHEN result.mark_type =„Tarpinis egzaminas“TADA rezultatas.žymos PABAIGA) „Tarpinis egzaminas“,
MAX(CASE WHEN result.mark_type ='Paskutinis egzaminas'TADA rezultatas.žymos PABAIGA) 'Paskutinis egzaminas',
SUMA(rezultatas.žymės) kaipIš viso
IŠ rezultato
GRUPĖ PAGAL rezultatą.std_id, result.course_id
UŽSAKYTI pagal rezultatą.std_id, result.course_id ASC;

Išvestyje rodomas naujas stulpelis pavadinimu Iš viso tai rodo kiekvieno kurso visų egzaminų tipų pažymių sumą, gautą kiekvieno konkretaus studento.

Pasukite eilutes į stulpelius keliose lentelėse:

Ankstesnės dvi užklausos taikomos rezultatas lentelę. Ši lentelė yra susijusi su kitomis dviem lentelėmis. Šitie yra studentų ir kursus . Jei norite rodyti studento vardą vietoj studento ID ir kurso pavadinimą vietoj kurso ID, turite parašyti užklausą SELECT naudodami tris susijusias lenteles, studentų , kursus ir rezultatas . Ši SELECT užklausa sukurta pridedant tris lentelės pavadinimus po FORM sąlygos ir nustatant tinkamas sąlygas WHERE sąlygoje, kad būtų gauti duomenys iš trijų lentelių ir generuojama tinkamesnė išvestis nei ankstesnėse SELECT užklausose.

PASIRINKITE mokinius.pavadinimaskaip ``Studento vardas``, kursai.pavadinimaskaip ``Kurso pavadinimas``,
MAX(CASE WHEN result.mark_type =„Vidinis egzaminas“TADA rezultatas.žymos PABAIGA) „CT“,
MAX(CASE WHEN result.mark_type =„Tarpinis egzaminas“TADA rezultatas.žymos PABAIGA) „Vidurys“,
MAX(CASE WHEN result.mark_type ='Paskutinis egzaminas'TADA rezultatas.žymos PABAIGA) „Finalas“,
SUMA(rezultatas.žymės) kaipIš viso
NUO studentų, kursų, rezultatas
KUR rezultatas.std_id = studentai.id ir rezultatas.kurso_id = kursai.kurso_id
GRUPĖ PAGAL rezultatą.std_id, result.course_id
UŽSAKYTI pagal rezultatą.std_id, result.course_id ASC;

Ši išvestis bus sugeneruota atlikus aukščiau pateiktą užklausą.

Išvada:

Kaip galite įdiegti „Pivot“ () funkciją be „Pivot“ () funkcijos palaikymo „MySQL“, parodyta šiame straipsnyje, naudojant tam tikrus netikrus duomenis. Tikiuosi, perskaitę šį straipsnį skaitytojai galės paversti bet kokius eilutės lygio duomenis stulpelio lygio duomenimis naudodami SELECT užklausą.