MySQL Pivot: rindu rotēšana kolonnās

Mysql Pivot Rotating Rows Columns



Datu bāzes tabulā var glabāt dažāda veida datus, un dažreiz mums ir jāpārveido rindas līmeņa dati kolonnas līmeņa datos. Šo problēmu var atrisināt, izmantojot funkciju PIVOT (). Šo funkciju izmanto, lai tabulas rindas pārvērstu kolonnu vērtībās. Bet šo funkciju atbalsta ļoti maz datu bāzes serveru, piemēram, Oracle vai SQL Server. Ja vēlaties veikt to pašu uzdevumu MySQL datu bāzes tabulā, jums jāraksta vaicājums SELECT, izmantojot CASE paziņojumu, lai rindas pārvērstu kolonnās. Rakstā parādīts veids, kā veikt PIVOT () funkcijas uzdevumu saistītās MySQL datu bāzes tabulās.

Priekšnosacījums:

Jums ir jāizveido datu bāze un dažas saistītas tabulas, kur vienas tabulas rindas tiks pārveidotas kolonnās, piemēram, PIVOT (). Palaidiet šādus SQL paziņojumus, lai izveidotu datu bāzi ar nosaukumu “ unidb 'Un izveidojiet trīs tabulas ar nosaukumu' studenti ',' kursus ' un ' rezultāts '. studenti un rezultāts tabulas būs saistītas ar attiecību viens pret daudziem un kursus un rezultātus tabulas šeit būs saistītas ar viens pret daudziem. CREATE paziņojums par rezultāts tabula satur divus ārējo atslēgu ierobežojumus laukiem, std_id , un course_id .







CREATE DATABASE unidb;
USE unidb;

IZVEIDOT GALDA studentus(
idPRIMĀRĀ ATSLĒGTA,
vārds varchar(piecdesmit)NAV NULL,
nodaļa VARCHAR(piecpadsmit)NAV NULL);

IZVEIDOT GALDA kursus(
course_id VARCHAR(divdesmit)Primārā atslēga,
vārds varchar(piecdesmit)NAV NULL,
kredīts SMALLINT NOT NULL);

CREATE TABLE rezultāts(
std_id INT NOT NULL,
course_id VARCHAR(divdesmit)NAV NULL,
mark_type VARCHAR(divdesmit)NAV NULL,
atzīmes SMALLINT NOT NULL,
SVEŠA ATSLĒGA(std_id)ATSAUCES studenti(id),
SVEŠA ATSLĒGA(course_id)REFERENCES kursi(course_id),
PRIMĀRĀ ATSLĒGTA(std_id, course_id, mark_type));

Ievietojiet dažus ierakstus studenti, kursi un rezultāts tabulas. Vērtības jāievieto tabulās, pamatojoties uz tabulas izveides laikā noteiktajiem ierobežojumiem.



IEVIETOT studentos VĒRTĪBAS
( '1937463','Hārpers Lī',“PMP”),
( '1937464','Garsija Markess',“PMP”),
( '1937465','Forsters, E.M.',“PMP”),
( '1937466','Ralfs Elisons',“PMP”);

IEVIETOT kursos VĒRTĪBAS
( “CSE-401”,'Objektorientēta programmēšana',3),
( “CSE-403”,'Datu struktūra',2),
( “CSE-407”,'Unix programmēšana',2);

IEVIETOT rezultāta VĒRTĪBAS
( '1937463',“CSE-401”,'Iekšējais eksāmens',piecpadsmit),
( '1937463',“CSE-401”,“Vidusposma eksāmens”,divdesmit),
( '1937463',“CSE-401”,'Gala eksāmens',35),
( '1937464',“CSE-403”,'Iekšējais eksāmens',17),
( '1937464',“CSE-403”,“Vidusposma eksāmens”,piecpadsmit),
( '1937464',“CSE-403”,'Gala eksāmens',30),
( '1937465',“CSE-401”,'Iekšējais eksāmens',18),
( '1937465',“CSE-401”,“Vidusposma eksāmens”,2. 3),
( '1937465',“CSE-401”,'Gala eksāmens',38),
( '1937466',“CSE-407”,'Iekšējais eksāmens',divdesmit),
( '1937466',“CSE-407”,“Vidusposma eksāmens”,22),
( '1937466',“CSE-407”,'Gala eksāmens',40);

Šeit, rezultāts tabula satur vairākas vienādas vērtības std_id , mark_type un course_id kolonnas katrā rindā. Šīs apmācības nākamajā daļā ir parādīts, kā šīs rindas pārvērst šīs tabulas kolonnās, lai dati tiktu parādīti sakārtotākā formātā.



Pagrieziet rindas kolonnās, izmantojot CASE paziņojumu:

Izpildiet šo vienkāršo SELECT paziņojumu, lai parādītu visus rezultāts tabula.





SELECT*NO rezultāta;

Rezultāts parāda četru studentu atzīmes par trim eksāmenu veidiem no trim kursiem. Tātad vērtības std_id , course_id un mark_type tiek atkārtotas vairākas reizes dažādiem studentiem, kursiem un eksāmenu veidiem.



Izvade būs lasāmāka, ja vaicājumu SELECT var uzrakstīt efektīvāk, izmantojot CASE paziņojumu. Sekojošais SELECT ar CASE paziņojumu pārveidos rindu atkārtojošās vērtības kolonnu nosaukumos un parādīs tabulu saturu lietotājam saprotamākā formātā.

SELECT result.std_id, result.course_id,
MAKS(CASE WHEN result.mark_type ='Iekšējais eksāmens'TAD rezultāts.zīmes END) 'Iekšējais eksāmens',
MAKS(CASE WHEN result.mark_type =“Vidusposma eksāmens”TAD rezultāts.zīmes END) “Vidusposma eksāmens”,
MAKS(CASE WHEN result.mark_type ='Gala eksāmens'TAD rezultāts.zīmes END) 'Gala eksāmens'
FROM rezultāts
GROUP BY result.std_id, result.course_id
PASŪTĪT PĒC rezultāta.std_id, result.course_id ASC;

Pēc iepriekš minētā paziņojuma palaišanas parādīsies šāda izvade, kas ir lasāmāka nekā iepriekšējā izvade.

Pagrieziet rindas kolonnās, izmantojot CASE un SUM ():

Ja vēlaties tabulā saskaitīt katra studenta katra kursa kopējo skaitu, jums jāizmanto apkopošanas funkcija SUM () grupēt pēc std_id un course_id ar CASE paziņojumu. Šis vaicājums ir izveidots, modificējot iepriekšējo vaicājumu ar funkciju SUM () un GROUP BY klauzulu.

SELECT result.std_id, result.course_id,
MAKS(CASE WHEN result.mark_type ='Iekšējais eksāmens'TAD rezultāts.zīmes END) 'Iekšējais eksāmens',
MAKS(CASE WHEN result.mark_type =“Vidusposma eksāmens”TAD rezultāts.zīmes END) “Vidusposma eksāmens”,
MAKS(CASE WHEN result.mark_type ='Gala eksāmens'TAD rezultāts.zīmes END) 'Gala eksāmens',
SUM(rezultāts.zīmes) Kopā
FROM rezultāts
GROUP BY result.std_id, result.course_id
PASŪTĪT PĒC rezultāta.std_id, result.course_id ASC;

Rezultātā tiek parādīta jauna kolonna ar nosaukumu Kopā tas parāda katra kursa visu eksāmenu veidu atzīmju summu, ko ieguvis katrs konkrētais students.

Pagriezt rindas uz kolonnām vairākās tabulās:

Iepriekšējie divi vaicājumi tiek lietoti rezultāts tabula. Šī tabula ir saistīta ar pārējām divām tabulām. Šie ir studenti un kursus . Ja vēlaties parādīt studenta vārdu, nevis studenta ID un kursa nosaukumu kursa ID vietā, tad jums ir jāraksta vaicājums SELECT, izmantojot trīs saistītās tabulas, studenti , kursus un rezultāts . Šāds vaicājums SELECT tiek izveidots, pievienojot trīs tabulu nosaukumus aiz klauzulas FORM un iestatot atbilstošus nosacījumus klauzulā WHERE, lai izgūtu datus no trim tabulām un ģenerētu atbilstošāku rezultātu nekā iepriekšējie SELECT vaicājumi.

SELECT studenti.vārds ``Studenta vārds``, kursi.nosaukums ``Kursa nosaukums``,
MAKS(CASE WHEN result.mark_type ='Iekšējais eksāmens'TAD rezultāts.zīmes END) 'CT',
MAKS(CASE WHEN result.mark_type =“Vidusposma eksāmens”TAD rezultāts.zīmes END) 'Mid',
MAKS(CASE WHEN result.mark_type ='Gala eksāmens'TAD rezultāts.zīmes END) 'Fināls',
SUM(rezultāts.zīmes) Kopā
NO studentiem, kursi, rezultāts
KUR rezultāts.std_id = students.id un result.course_id = course.course_id
GROUP BY result.std_id, result.course_id
PASŪTĪT PĒC rezultāta.std_id, result.course_id ASC;

Pēc iepriekš minētā vaicājuma izpildes tiks ģenerēta šāda izvade.

Secinājums:

Šajā rakstā ir parādīts, kā jūs varat ieviest funkcijas Pivot () funkcionalitāti bez MySQL funkcijas Pivot () atbalsta, izmantojot dažus fiktīvus datus. Es ceru, ka lasītāji pēc šī raksta izlasīšanas varēs pārveidot visus rindas līmeņa datus par slejas līmeņa datiem, izmantojot vaicājumu SELECT.