MySQL Pivot: rijen naar kolommen roteren

Mysql Pivot Rotating Rows Columns



Een databasetabel kan verschillende soorten gegevens opslaan en soms moeten we gegevens op rijniveau omzetten in gegevens op kolomniveau. Dit probleem kan worden opgelost door de functie PIVOT() te gebruiken. Deze functie wordt gebruikt om rijen van een tabel te roteren in kolomwaarden. Maar deze functie wordt door zeer weinig databaseservers ondersteund, zoals Oracle of SQL Server. Als u dezelfde taak in de MySQL-databasetabel wilt uitvoeren, moet u de SELECT-query schrijven met behulp van de CASE-instructie om de rijen in kolommen te roteren. Het artikel toont de manier om de taak van de PIVOT()-functie uit te voeren binnen gerelateerde MySQL-databasetabellen.

Voorwaarde:

U moet een database en enkele gerelateerde tabellen maken waarin rijen van één tabel worden geconverteerd naar kolommen zoals de PIVOT()-functie. Voer de volgende SQL-instructies uit om een ​​database met de naam ' unidb ' en maak drie tabellen met de naam ' studenten ’,‘ cursussen ' en ' resultaat '. studenten en resultaat tabellen worden gerelateerd door een een-op-veel relatie en cursussen en resultaten tabellen worden hier gerelateerd door een een-op-veel-relatie. CREATE verklaring van de resultaat tabel bevat twee externe sleutelbeperkingen voor de velden, std_id , en Cursus id .







MAAK DATABASE unidb;
GEBRUIK unidb;

MAAK TAFEL studenten(
ID kaartINT PRIMAIRE SLEUTEL,
naam varchar(vijftig)NIET NUL,
afdeling VARCHAR(vijftien)NIET NUL);

MAAK TAFEL cursussen(
course_id VARCHAR(twintig)HOOFDSLEUTEL,
naam varchar(vijftig)NIET NUL,
krediet SMALLINT NIET NULL);

MAAK TAFEL resultaat(
std_id INT NIET NULL,
course_id VARCHAR(twintig)NIET NUL,
mark_type VARCHAR(twintig)NIET NUL,
markeert SMALLINT NIET NULL,
VREEMDE SLEUTEL(std_id)REFERENTIES studenten(ID kaart),
VREEMDE SLEUTEL(Cursus id)REFERENTIES cursussen(Cursus id),
HOOFDSLEUTEL(std_id, course_id, mark_type));

Sommige records invoegen in studenten, cursussen en resultaat tafels. De waarden moeten in de tabellen worden ingevoegd op basis van de beperkingen die zijn ingesteld bij het maken van de tabel.



INSERT IN DE studenten WAARDEN
( '1937463','Harper Lee','CSE'),
( '1937464','Garcia Márquez','CSE'),
( '1937465','Forster, E.M.','CSE'),
( '1937466','Ralph Ellison','CSE');

INVOEREN IN WAARDEN van cursussen
( 'CSE-401','Object georiënteerd programmeren',3),
( 'CSE-403','Data structuur',2),
( 'CSE-407','Unix-programmering',2);

INVOEREN IN resultaat WAARDEN
( '1937463','CSE-401','Intern Examen',vijftien),
( '1937463','CSE-401','Tussentijdse examen',twintig),
( '1937463','CSE-401','Eindexamen',35),
( '1937464','CSE-403','Intern Examen',17),
( '1937464','CSE-403','Tussentijdse examen',vijftien),
( '1937464','CSE-403','Eindexamen',30),
( '1937465','CSE-401','Intern Examen',18),
( '1937465','CSE-401','Tussentijdse examen',2. 3),
( '1937465','CSE-401','Eindexamen',38),
( '1937466','CSE-407','Intern Examen',twintig),
( '1937466','CSE-407','Tussentijdse examen',22),
( '1937466','CSE-407','Eindexamen',40);

Hier, resultaat tabel bevat meerdere dezelfde waarden voor std_id , mark_type en Cursus id kolommen in elke rij. In het volgende deel van deze zelfstudie wordt getoond hoe u deze rijen in kolommen van deze tabel kunt converteren om de gegevens in een meer georganiseerde indeling weer te geven.



Roteer rijen naar kolommen met behulp van de CASE-instructie:

Voer de volgende eenvoudige SELECT-instructie uit om alle records van de resultaat tafel.





KIES*VAN resultaat;

De output toont de vier studentencijfers voor drie examentypen van drie cursussen. Dus de waarden van std_id , Cursus id en mark_type worden meerdere keren herhaald voor de verschillende studenten, cursussen en examentypes.



De uitvoer zal beter leesbaar zijn als de SELECT-query efficiënter kan worden geschreven met behulp van de CASE-instructie. De volgende SELECT met de CASE-instructie zal de herhalende waarden van de rijen omzetten in de kolomnamen en de inhoud van de tabellen weergeven in een voor de gebruiker begrijpelijker formaat.

SELECT resultaat.std_id, resultaat.cursus_id,
MAX(CASE WHEN resultaat.mark_type ='Intern Examen'THEN resultaat.markeringen END) 'Intern Examen',
MAX(CASE WHEN resultaat.mark_type ='Tussentijdse examen'THEN resultaat.markeringen END) 'Tussentijdse examen',
MAX(CASE WHEN resultaat.mark_type ='Eindexamen'THEN resultaat.markeringen END) 'Eindexamen'
VAN resultaat
GROEP OP resultaat.std_id, resultaat.cursus_id
BESTELLEN OP resultaat.std_id, resultaat.cursus_id ASC;

De volgende uitvoer zal verschijnen na het uitvoeren van de bovenstaande instructie die leesbaarder is dan de vorige uitvoer.

Roteer rijen naar kolommen met CASE en SUM():

Als je het totale aantal van elke cursus van elke student uit de tabel wilt tellen, moet je de aggregatiefunctie gebruiken SOM() groeperen op std_id en Cursus id met de CASE-verklaring. De volgende query wordt gemaakt door de vorige query te wijzigen met de functie SUM() en de GROUP BY-component.

SELECT resultaat.std_id, resultaat.cursus_id,
MAX(CASE WHEN resultaat.mark_type ='Intern Examen'THEN resultaat.markeringen END) 'Intern Examen',
MAX(CASE WHEN resultaat.mark_type ='Tussentijdse examen'THEN resultaat.markeringen END) 'Tussentijdse examen',
MAX(CASE WHEN resultaat.mark_type ='Eindexamen'THEN resultaat.markeringen END) 'Eindexamen',
SOM(resultaat.markeringen) alsTotaal
VAN resultaat
GROEP OP resultaat.std_id, resultaat.cursus_id
BESTELLEN OP resultaat.std_id, resultaat.cursus_id ASC;

De uitvoer toont een nieuwe kolom met de naam Totaal dat is het weergeven van de som van de cijfers van alle examentypes van elke cursus die door elke specifieke student is behaald.

Roteer rijen naar kolommen in meerdere tabellen:

De vorige twee zoekopdrachten worden toegepast op de resultaat tafel. Deze tabel is gerelateerd aan de andere twee tabellen. Dit zijn studenten en cursussen . Als je de studentnaam wilt weergeven in plaats van student-ID en cursusnaam in plaats van cursus-ID, dan moet je de SELECT-query schrijven met behulp van drie gerelateerde tabellen, studenten , cursussen en resultaat . De volgende SELECT-query wordt gemaakt door drie tabelnamen toe te voegen na de FORM-component en de juiste voorwaarden in te stellen in de WHERE-component om de gegevens uit de drie tabellen op te halen en meer geschikte uitvoer te genereren dan de vorige SELECT-query's.

SELECT student.nameals ``Studenten naam``, cursussen.naamals ``Cursus naam``,
MAX(CASE WHEN resultaat.mark_type ='Intern Examen'THEN resultaat.markeringen END) 'CT',
MAX(CASE WHEN resultaat.mark_type ='Tussentijdse examen'THEN resultaat.markeringen END) 'Midden',
MAX(CASE WHEN resultaat.mark_type ='Eindexamen'THEN resultaat.markeringen END) 'Laatste',
SOM(resultaat.markeringen) alsTotaal
VAN studenten, cursussen, resultaat
WAAR resultaat.std_id = studenten.id en resultaat.cursus_id= cursussen.cursus_id
GROEP OP resultaat.std_id, resultaat.cursus_id
BESTELLEN OP resultaat.std_id, resultaat.cursus_id ASC;

De volgende uitvoer wordt gegenereerd na het uitvoeren van de bovenstaande query.

Conclusie:

Hoe u de functionaliteit van de Pivot()-functie kunt implementeren zonder de ondersteuning van de Pivot()-functie in MySQL, wordt in dit artikel getoond met behulp van enkele dummy-gegevens. Ik hoop dat de lezers in staat zullen zijn om alle gegevens op rijniveau om te zetten in gegevens op kolomniveau door de SELECT-query te gebruiken na het lezen van dit artikel.