MySQL Pivot: rotazione di righe in colonne

Mysql Pivot Rotating Rows Columns

Una tabella di database può memorizzare diversi tipi di dati e talvolta è necessario trasformare i dati a livello di riga in dati a livello di colonna. Questo problema può essere risolto utilizzando la funzione PIVOT(). Questa funzione viene utilizzata per ruotare le righe di una tabella in valori di colonna. Ma questa funzione è supportata da pochissimi server di database, come Oracle o SQL Server. Se vuoi eseguire la stessa attività nella tabella del database MySQL, devi scrivere la query SELECT utilizzando l'istruzione CASE per ruotare le righe in colonne. L'articolo mostra come eseguire l'attività della funzione PIVOT() all'interno delle tabelle di database MySQL correlate.

Prerequisito:

Devi creare un database e alcune tabelle correlate in cui le righe di una tabella verranno convertite nelle colonne come la funzione PIVOT(). Eseguire le seguenti istruzioni SQL per creare un database denominato ' unidb ' e creare tre tabelle denominate ' studenti ',' corsi ' e ' risultato '. studenti e risultato le tabelle saranno legate da una relazione uno a molti e corsi e risultati le tabelle saranno correlate da una relazione uno-a-molti qui. CREATE dichiarazione del risultato tabella contiene due vincoli di chiave esterna per i campi, id_std , e ID_corso .



CREA DATABASE unidb;
USA unidb;

CREA TABELLA studenti(
IDINT PRIMARIA CHIAVE,
nome varchar(cinquanta)NON NULLO,
dipartimento VARCHAR(quindici)NON NULLO);

Corsi CREATE TABLE(
course_id VARCHAR(venti)CHIAVE PRIMARIA,
nome varchar(cinquanta)NON NULLO,
credito SMALLINT NOT NULL);

Risultato CREA TABELLA(
std_id INT NON NULL,
course_id VARCHAR(venti)NON NULLO,
mark_type VARCHAR(venti)NON NULLO,
segna SMALLINT NOT NULL,
CHIAVE ESTERA(id_std)REFERENZE studenti(ID),
CHIAVE ESTERA(ID_corso)REFERENZE corsi(ID_corso),
CHIAVE PRIMARIA(std_id, course_id, mark_type));

Inserisci alcuni record in studenti, corsi e risultati tabelle. I valori devono essere inseriti nelle tabelle in base alle restrizioni impostate al momento della creazione della tabella.



INSERIRE NEI VALORI DEGLI STUDENTI
( '1937463','Harper Lee','CSE'),
( '1937464','Garcia Marquez','CSE'),
( '1937465','Forster, E.M.','CSE'),
( '1937466','Ralph Ellison','CSE');

INSERIRE NEI CORSI VALORI
( 'CSE-401','Programmazione orientata agli oggetti',3),
( 'CSE-403','Struttura dati',2),
( 'CSE-407','Programmazione Unix',2);

INSERIRE NEL risultato VALORI
( '1937463','CSE-401','Esame interno',quindici),
( '1937463','CSE-401','Esame di medio termine',venti),
( '1937463','CSE-401','Esame finale',35),
( '1937464','CSE-403','Esame interno',17),
( '1937464','CSE-403','Esame di medio termine',quindici),
( '1937464','CSE-403','Esame finale',30),
( '1937465','CSE-401','Esame interno',18),
( '1937465','CSE-401','Esame di medio termine',2. 3),
( '1937465','CSE-401','Esame finale',38),
( '1937466','CSE-407','Esame interno',venti),
( '1937466','CSE-407','Esame di medio termine',22),
( '1937466','CSE-407','Esame finale',40);

Qui, risultato la tabella contiene più stessi valori per id_std , mark_type e ID_corso colonne in ogni riga. Come convertire queste righe in colonne di questa tabella per visualizzare i dati in un formato più organizzato è mostrato nella parte successiva di questo tutorial.



Ruota le righe in colonne usando l'istruzione CASE:

Eseguire la seguente semplice istruzione SELECT per visualizzare tutti i record di risultato tavolo.

SELEZIONARE*DA risultato;

L'output mostra i quattro voti dello studente per tre tipi di esami di tre corsi. Quindi i valori di id_std , ID_corso e mark_type vengono ripetute più volte per i diversi studenti, corsi e tipi di esame.



L'output sarà più leggibile se la query SELECT può essere scritta in modo più efficiente utilizzando l'istruzione CASE. La seguente SELECT con l'istruzione CASE trasformerà i valori ripetuti delle righe nei nomi delle colonne e visualizzerà il contenuto delle tabelle in un formato più comprensibile per l'utente.

SELEZIONA risultato.std_id, risultato.corso_id,
MAX(CASO QUANDO risultato.mark_type ='Esame interno'ALLORA contrassegni.risultati END) 'Esame interno',
MAX(CASO QUANDO risultato.mark_type ='Esame di medio termine'ALLORA contrassegni.risultati END) 'Esame di medio termine',
MAX(CASO QUANDO risultato.mark_type ='Esame finale'ALLORA contrassegni.risultati END) 'Esame finale'
DA risultato
GROUP BY result.std_id, result.course_id
ORDINA PER risultato.std_id, risultato.corso_id ASC;

Il seguente output apparirà dopo aver eseguito l'istruzione precedente che è più leggibile rispetto all'output precedente.

Ruota le righe in colonne usando CASE e SUM():

Se vuoi contare il numero totale di ogni corso di ogni studente dalla tabella, devi usare la funzione aggregata SOMMA() raggruppare per id_std e ID_corso con la dichiarazione CASE. La query seguente viene creata modificando la query precedente con la funzione SUM() e la clausola GROUP BY.

SELEZIONA risultato.std_id,risultato.corso_id,
MAX(CASO QUANDO risultato.mark_type ='Esame interno'ALLORA contrassegni.risultati END) 'Esame interno',
MAX(CASO QUANDO risultato.mark_type ='Esame di medio termine'ALLORA contrassegni.risultati END) 'Esame di medio termine',
MAX(CASO QUANDO risultato.mark_type ='Esame finale'ALLORA contrassegni.risultati END) 'Esame finale',
SOMMA(risultati.marks) comeTotale
DA risultato
GROUP BY result.std_id, result.course_id
ORDINA PER risultato.std_id, risultato.corso_id ASC;

L'output mostra una nuova colonna denominata Totale ovvero visualizzare la somma dei voti di tutte le tipologie di esami di ciascun corso ottenuti da ciascun particolare studente.

Ruota le righe in colonne in più tabelle:

Le due query precedenti vengono applicate al risultato tavolo. Questa tabella è correlata alle altre due tabelle. Questi sono studenti e corsi . Se vuoi visualizzare il nome dello studente invece dell'ID studente e il nome del corso invece dell'ID del corso, devi scrivere la query SELECT utilizzando tre tabelle correlate, studenti , corsi e risultato . La seguente query SELECT viene creata aggiungendo tre nomi di tabella dopo la clausola FORM e impostando condizioni appropriate nella clausola WHERE per recuperare i dati dalle tre tabelle e generare un output più appropriato rispetto alle precedenti query SELECT.

SELEZIONA studenti.nomecome ``Nome dello studente``, corsi.nomecome ``Nome del corso``,
MAX(CASO QUANDO risultato.mark_type ='Esame interno'ALLORA contrassegni.risultati END) 'CT',
MAX(CASO QUANDO risultato.mark_type ='Esame di medio termine'ALLORA contrassegni.risultati END) 'metà',
MAX(CASO QUANDO risultato.mark_type ='Esame finale'ALLORA contrassegni.risultati END) 'Finale',
SOMMA(risultati.marks) comeTotale
DA studenti, corsi, risultati
WHERE risultato.std_id = studenti.id e risultato.corso_id= corsi.id_corso
GROUP BY result.std_id, result.course_id
ORDINA PER risultato.std_id, risultato.corso_id ASC;

Il seguente output verrà generato dopo aver eseguito la query precedente.

Conclusione:

Come è possibile implementare la funzionalità della funzione Pivot() senza il supporto della funzione Pivot() in MySQL è mostrato in questo articolo utilizzando alcuni dati fittizi. Spero che i lettori saranno in grado di trasformare qualsiasi dato a livello di riga in dati a livello di colonna utilizzando la query SELECT dopo aver letto questo articolo.