MySQL Pivot: περιστροφή σειρών σε στήλες

Mysql Pivot Rotating Rows Columns



Ένας πίνακας βάσεων δεδομένων μπορεί να αποθηκεύσει διαφορετικούς τύπους δεδομένων και μερικές φορές χρειάζεται να μετατρέψουμε δεδομένα σε επίπεδο γραμμής σε δεδομένα σε επίπεδο στήλης. Αυτό το πρόβλημα μπορεί να λυθεί χρησιμοποιώντας τη συνάρτηση PIVOT (). Αυτή η συνάρτηση χρησιμοποιείται για την περιστροφή γραμμών ενός πίνακα σε τιμές στήλης. Αλλά αυτή η λειτουργία υποστηρίζεται από πολύ λίγους διακομιστές βάσεων δεδομένων, όπως Oracle ή SQL Server. Εάν θέλετε να κάνετε την ίδια εργασία στον πίνακα βάσης δεδομένων MySQL, πρέπει να γράψετε το ερώτημα SELECT χρησιμοποιώντας την πρόταση CASE για να περιστρέψετε τις γραμμές σε στήλες. Το άρθρο δείχνει τον τρόπο εκτέλεσης της εργασίας της συνάρτησης PIVOT () στους σχετικούς πίνακες βάσεων δεδομένων MySQL.

Προαπαιτούμενο:

Πρέπει να δημιουργήσετε μια βάση δεδομένων και μερικούς σχετικούς πίνακες όπου οι γραμμές ενός πίνακα θα μετατραπούν σε στήλες όπως η συνάρτηση PIVOT (). Εκτελέστε τις ακόλουθες προτάσεις SQL για να δημιουργήσετε μια βάση δεδομένων με το όνομα « unidb »Και δημιουργήστε τρεις πίνακες με το όνομα« Φοιτητές ',' ΚΥΚΛΟΣ ΜΑΘΗΜΑΤΩΝ ' και ' αποτέλεσμα '. Φοιτητές και αποτέλεσμα οι πίνακες θα σχετίζονται με τη σχέση ενός προς πολλά και ΚΥΚΛΟΣ ΜΑΘΗΜΑΤΩΝ και Αποτελέσματα οι πίνακες θα σχετίζονται με τη σχέση ενός προς πολλά εδώ. ΔΗΜΙΟΥΡΓΙΑ δήλωση του αποτέλεσμα ο πίνακας περιέχει δύο ξένους περιορισμούς κλειδιά για τα πεδία, std_id , και course_id Το







ΔΗΜΙΟΥΡΓΙΑ ΒΑΣΗΣ ΔΕΔΟΜΕΝΩΝ unidb;
ΧΡΗΣΗ unidb?

ΔΗΜΙΟΥΡΓΗΣΤΕ ΤΡΑΠΕΖΙ μαθητές(
ταυτότηταINT PRIMARY KEY,
όνομα varchar(πενήντα)ΟΧΙ ΚΕΝΟ,
τμήμα VARCHAR(δεκαπέντε)ΟΧΙ ΚΕΝΟ)?

ΔΗΜΙΟΥΡΓΗΣΤΕ μαθήματα ΠΙΝΑΚΑΣ(
course_id VARCHAR(είκοσι)ΠΡΩΤΕΥΩΝ ΚΛΕΙΔΙ,
όνομα varchar(πενήντα)ΟΧΙ ΚΕΝΟ,
πίστωση SMALLINT NOT NULL)?

ΔΗΜΙΟΥΡΓΙΑ ΑΠΟΤΕΛΕΣΜΑΤΟΣ(
std_id ΔΕΝ ΕΙΝΑΙ NULL,
course_id VARCHAR(είκοσι)ΟΧΙ ΚΕΝΟ,
mark_type VARCHAR(είκοσι)ΟΧΙ ΚΕΝΟ,
σημάδια SMALLINT NOT NULL,
ΞΕΝΟ ΚΛΕΙΔΙ(std_id)ΑΝΑΦΟΡΕΣ μαθητές(ταυτότητα),
ΞΕΝΟ ΚΛΕΙΔΙ(course_id)Μαθήματα ΑΝΑΦΟΡΩΝ(course_id),
ΠΡΩΤΕΥΩΝ ΚΛΕΙΔΙ(std_id, course_id, mark_type))?

Εισαγάγετε μερικές εγγραφές μαθητές, μαθήματα και αποτέλεσμα τραπέζια. Οι τιμές πρέπει να εισαχθούν στους πίνακες με βάση τους περιορισμούς που έχουν τεθεί κατά τη δημιουργία του πίνακα.



ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΑΞΙΕΣ των μαθητών
( '1937463',«Χάρπερ Λι»,'ΧΑΚ'),
( '1937464',«Γκαρσία Μάρκες»,'ΧΑΚ'),
( '1937465',«Φόρστερ, Ε.Μ.»,'ΧΑΚ'),
( '1937466',«Ραλφ Έλισον»,'ΧΑΚ')?

ΕΙΣΑΓΩΓΗ ΣΕ ΑΞΙΕΣ ΤΩΝ μαθημάτων
( 'CSE-401','Αντικειμενοστραφής προγραμματισμός',3),
( 'CSE-403','Δομή δεδομένων',2),
( 'CSE-407','Προγραμματισμός Unix',2)?

ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΑΞΙΕΣ του αποτελέσματος
( '1937463','CSE-401',«Εσωτερική εξέταση»,δεκαπέντε),
( '1937463','CSE-401','Ενδιάμεση εξέταση',είκοσι),
( '1937463','CSE-401','Τελικές εξετάσεις',35),
( '1937464','CSE-403',«Εσωτερική εξέταση»,17),
( '1937464','CSE-403','Ενδιάμεση εξέταση',δεκαπέντε),
( '1937464','CSE-403','Τελικές εξετάσεις',30),
( '1937465','CSE-401',«Εσωτερική εξέταση»,18),
( '1937465','CSE-401','Ενδιάμεση εξέταση',2. 3),
( '1937465','CSE-401','Τελικές εξετάσεις',38),
( '1937466','CSE-407',«Εσωτερική εξέταση»,είκοσι),
( '1937466','CSE-407','Ενδιάμεση εξέταση',22),
( '1937466','CSE-407','Τελικές εξετάσεις',40)?

Εδώ, αποτέλεσμα ο πίνακας περιέχει πολλές ίδιες τιμές για std_id , mark_type και course_id στήλες σε κάθε σειρά. Ο τρόπος μετατροπής αυτών των γραμμών σε στήλες αυτού του πίνακα για την εμφάνιση των δεδομένων σε πιο οργανωμένη μορφή εμφανίζεται στο επόμενο μέρος αυτού του σεμιναρίου.



Περιστροφή σειρών σε στήλες χρησιμοποιώντας τη δήλωση CASE:

Εκτελέστε την ακόλουθη απλή πρόταση SELECT για να εμφανίσετε όλες τις εγγραφές του αποτέλεσμα τραπέζι.





ΕΠΙΛΕΓΩ*ΑΠΟ το αποτέλεσμα?

Η έξοδος δείχνει τα τέσσερα μόρια μαθητών για τρεις τύπους εξετάσεων τριών μαθημάτων. Οι αξίες λοιπόν του std_id , course_id και mark_type επαναλαμβάνονται πολλές φορές για τους διαφορετικούς μαθητές, μαθήματα και τύπους εξετάσεων.



Η έξοδος θα είναι πιο ευανάγνωστη εάν το ερώτημα SELECT μπορεί να γραφτεί πιο αποτελεσματικά χρησιμοποιώντας τη δήλωση CASE. Το ακόλουθο SELECT με τη δήλωση CASE θα μετατρέψει τις επαναλαμβανόμενες τιμές των γραμμών σε ονόματα στηλών και θα εμφανίσει το περιεχόμενο των πινάκων σε πιο κατανοητή μορφή για τον χρήστη.

ΕΠΙΛΕΞΤΕ result.std_id, result.course_id,
ΜΕΓΙΣΤΗ(ΠΕΡΙΠΤΩΣΗ ΠΟΤΕ αποτέλεσμα.mark_type =«Εσωτερική εξέταση»ΤΟΤΕ αποτέλεσμα.σημάνσεις ΤΕΛΟΣ) «Εσωτερική εξέταση»,
ΜΕΓΙΣΤΗ(ΠΕΡΙΠΤΩΣΗ ΠΟΤΕ αποτέλεσμα.mark_type ='Ενδιάμεση εξέταση'ΤΟΤΕ αποτέλεσμα.σημάνσεις ΤΕΛΟΣ) 'Ενδιάμεση εξέταση',
ΜΕΓΙΣΤΗ(ΠΕΡΙΠΤΩΣΗ ΠΟΤΕ αποτέλεσμα.mark_type ='Τελικές εξετάσεις'ΤΟΤΕ αποτέλεσμα.σημάνσεις ΤΕΛΟΣ) 'Τελικές εξετάσεις'
ΑΠΟ το αποτέλεσμα
GROUP BY result.std_id, result.course_id
ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ result.std_id, result.course_id ASC;

Η ακόλουθη έξοδος θα εμφανιστεί μετά την εκτέλεση της παραπάνω δήλωσης η οποία είναι πιο ευανάγνωστη από την προηγούμενη έξοδο.

Περιστροφή σειρών σε στήλες χρησιμοποιώντας CASE και SUM ():

Εάν θέλετε να μετρήσετε τον συνολικό αριθμό κάθε μαθήματος κάθε μαθητή από τον πίνακα, τότε πρέπει να χρησιμοποιήσετε τη συνάρτηση συνάθροισης ΑΘΡΟΙΣΜΑ() ομάδα κατά std_id και course_id με τη δήλωση CASE. Το ακόλουθο ερώτημα δημιουργείται με την τροποποίηση του προηγούμενου ερωτήματος με συνάρτηση SUM () και ρήτρα GROUP BY.

ΕΠΙΛΕΞΤΕ result.std_id, result.course_id,
ΜΕΓΙΣΤΗ(ΠΕΡΙΠΤΩΣΗ ΠΟΤΕ αποτέλεσμα.mark_type =«Εσωτερική εξέταση»ΤΟΤΕ αποτέλεσμα.σημάνσεις ΤΕΛΟΣ) «Εσωτερική εξέταση»,
ΜΕΓΙΣΤΗ(ΠΕΡΙΠΤΩΣΗ ΠΟΤΕ αποτέλεσμα.mark_type ='Ενδιάμεση εξέταση'ΤΟΤΕ αποτέλεσμα.σημάνσεις ΤΕΛΟΣ) 'Ενδιάμεση εξέταση',
ΜΕΓΙΣΤΗ(ΠΕΡΙΠΤΩΣΗ ΠΟΤΕ αποτέλεσμα.mark_type ='Τελικές εξετάσεις'ΤΟΤΕ αποτέλεσμα.σημάνσεις ΤΕΛΟΣ) 'Τελικές εξετάσεις',
ΑΘΡΟΙΣΜΑ(αποτέλεσμα.σημάνσεις) όπως καιΣύνολο
ΑΠΟ το αποτέλεσμα
GROUP BY result.std_id, result.course_id
ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ result.std_id, result.course_id ASC;

Η έξοδος εμφανίζει μια νέα στήλη με όνομα Σύνολο που εμφανίζει το άθροισμα των βαθμών όλων των τύπων εξετάσεων κάθε μαθήματος που έχει ληφθεί από κάθε συγκεκριμένο μαθητή.

Περιστροφή γραμμών σε στήλες σε πολλούς πίνακες:

Τα δύο προηγούμενα ερωτήματα εφαρμόζονται στο αποτέλεσμα τραπέζι. Αυτός ο πίνακας σχετίζεται με τους άλλους δύο πίνακες. Αυτά είναι Φοιτητές και ΚΥΚΛΟΣ ΜΑΘΗΜΑΤΩΝ Το Εάν θέλετε να εμφανίσετε το όνομα του μαθητή αντί του αναγνωριστικού μαθητή και του μαθήματος αντί του αναγνωριστικού μαθήματος, τότε πρέπει να γράψετε το ερώτημα SELECT χρησιμοποιώντας τρεις σχετικούς πίνακες, Φοιτητές , ΚΥΚΛΟΣ ΜΑΘΗΜΑΤΩΝ και αποτέλεσμα Το Το ακόλουθο ερώτημα SELECT δημιουργείται με την προσθήκη τριών ονομάτων πινάκων μετά τη ρήτρα FORM και τον καθορισμό κατάλληλων συνθηκών στη ρήτρα WHERE για ανάκτηση των δεδομένων από τους τρεις πίνακες και δημιουργία πιο κατάλληλης εξόδου από τα προηγούμενα ερωτήματα SELECT.

ΕΠΙΛΕΞΤΕ student.nameόπως και 'Ονομα μαθητή', course.nameόπως και 'Όνομα μαθήματος',
ΜΕΓΙΣΤΗ(ΠΕΡΙΠΤΩΣΗ ΠΟΤΕ αποτέλεσμα.mark_type =«Εσωτερική εξέταση»ΤΟΤΕ αποτέλεσμα.σημάνσεις ΤΕΛΟΣ) 'CT',
ΜΕΓΙΣΤΗ(ΠΕΡΙΠΤΩΣΗ ΠΟΤΕ αποτέλεσμα.mark_type ='Ενδιάμεση εξέταση'ΤΟΤΕ αποτέλεσμα.σημάνσεις ΤΕΛΟΣ) 'Στα μέσα',
ΜΕΓΙΣΤΗ(ΠΕΡΙΠΤΩΣΗ ΠΟΤΕ αποτέλεσμα.mark_type ='Τελικές εξετάσεις'ΤΟΤΕ αποτέλεσμα.σημάνσεις ΤΕΛΟΣ) 'Τελικός',
ΑΘΡΟΙΣΜΑ(αποτέλεσμα.σημάνσεις) όπως καιΣύνολο
ΑΠΟ μαθητές, μαθήματα, αποτέλεσμα
WHERE result.std_id = students.id και result.course_id = course.course_id
GROUP BY result.std_id, result.course_id
ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ result.std_id, result.course_id ASC;

Η ακόλουθη έξοδος θα δημιουργηθεί μετά την εκτέλεση του παραπάνω ερωτήματος.

Συμπέρασμα:

Το πώς μπορείτε να εφαρμόσετε τη λειτουργικότητα της συνάρτησης Pivot () χωρίς την υποστήριξη της συνάρτησης Pivot () στο MySQL παρουσιάζεται σε αυτό το άρθρο χρησιμοποιώντας ορισμένα εικονικά δεδομένα. Ελπίζω ότι οι αναγνώστες θα μπορούν να μετατρέψουν τυχόν δεδομένα σε επίπεδο γραμμής σε δεδομένα σε επίπεδο στήλης χρησιμοποιώντας το ερώτημα SELECT μετά την ανάγνωση αυτού του άρθρου.