MySQL Pivot: satırları sütunlara döndürme

Mysql Pivot Rotating Rows Columns



Bir veritabanı tablosu farklı türde verileri depolayabilir ve bazen satır düzeyindeki verileri sütun düzeyindeki verilere dönüştürmemiz gerekir. Bu sorun, PIVOT() işlevi kullanılarak çözülebilir. Bu fonksiyon, bir tablonun satırlarını sütun değerlerine döndürmek için kullanılır. Ancak bu işlev, Oracle veya SQL Server gibi çok az sayıda veritabanı sunucusu tarafından desteklenir. Aynı görevi MySQL veritabanı tablosunda yapmak istiyorsanız, satırları sütunlara döndürmek için CASE deyimini kullanarak SELECT sorgusunu yazmanız gerekir. Makale, ilgili MySQL veritabanı tablolarında PIVOT() işlevinin görevini yapmanın yolunu gösterir.

Ön koşul:

Bir tablonun satırlarının PIVOT() işlevi gibi sütunlara dönüştürüleceği bir veritabanı ve bazı ilgili tablolar oluşturmanız gerekir. ' adlı bir veritabanı oluşturmak için aşağıdaki SQL deyimlerini çalıştırın. unidb ' ve 'adlı üç tablo oluşturun öğrenciler ',' dersler ' ve ' sonuç '. öğrenciler ve sonuç tablolar bire çok ilişki ile ilişkilendirilecek ve dersler ve Sonuçlar tablolar burada bire-çok ilişkisi ile ilişkilendirilecektir. CREATE ifadesi sonuç tablo, alanlar için iki yabancı anahtar kısıtlaması içerir, std_id , ve kurs kimliği .







CREATE DATABASE unidb;
unidb'yi KULLAN;

TABLO OLUŞTUR öğrenciler(
İDİÇ BİRİNCİL ANAHTAR,
isim varchar(elli)GEÇERSİZ DEĞİL,
departman VARCHAR(on beş)GEÇERSİZ DEĞİL);

TABLO OLUŞTUR kursları(
Course_id VARCHAR(yirmi)BİRİNCİL ANAHTAR,
isim varchar(elli)GEÇERSİZ DEĞİL,
kredi KÜÇÜK NULL DEĞİL);

TABLO OLUŞTUR sonucu(
std_id INT NULL DEĞİL,
Course_id VARCHAR(yirmi)GEÇERSİZ DEĞİL,
mark_type VARCHAR(yirmi)GEÇERSİZ DEĞİL,
KÜÇÜK DEĞİL NULL olarak işaretler,
YABANCI ANAHTAR(std_id)REFERANSLAR öğrenciler(İD),
YABANCI ANAHTAR(kurs kimliği)REFERANSLAR kursları(kurs kimliği),
BİRİNCİL ANAHTAR(std_id, kurs_kimliği, mark_type));

İçine bazı kayıtlar ekleyin öğrenciler, dersler ve sonuç tablolar. Değerler, tablo oluşturma sırasında belirlenen kısıtlamalara dayalı olarak tablolara eklenmelidir.



ÖĞRENCİ DEĞERLERİNE EKLE
( '1937463','Harper Lee','ÖAM'),
( '1937464','Garcia Marquez','ÖAM'),
( '1937465','Forster, E.M.','ÖAM'),
( '1937466','Ralph Ellison','ÖAM');

DERS DEĞERLERİNE EKLE
( 'ÖAM-401','Nesne yönelimli programlama',3),
( 'ÖAM-403','Veri yapısı',2),
( 'ÖAM-407','Unix programlama',2);

Sonuç DEĞERLERİNE EKLE
( '1937463','ÖAM-401','İç Sınav',on beş),
( '1937463','ÖAM-401','Vize',yirmi),
( '1937463','ÖAM-401','Final Sınavı',35),
( '1937464','ÖAM-403','İç Sınav',17),
( '1937464','ÖAM-403','Vize',on beş),
( '1937464','ÖAM-403','Final Sınavı',30),
( '1937465','ÖAM-401','İç Sınav',18),
( '1937465','ÖAM-401','Vize',2. 3),
( '1937465','ÖAM-401','Final Sınavı',38),
( '1937466','ÖAM-407','İç Sınav',yirmi),
( '1937466','ÖAM-407','Vize',22),
( '1937466','ÖAM-407','Final Sınavı',40);

Buraya, sonuç tablo için birden çok aynı değer içeriyor std_id , mark_type ve kurs kimliği her satırdaki sütunlar. Verileri daha düzenli bir biçimde görüntülemek için bu satırların bu tablonun sütunlarına nasıl dönüştürüleceği bu öğreticinin sonraki bölümünde gösterilmektedir.



CASE deyimini kullanarak satırları sütunlara döndürün:

Tüm kayıtları görüntülemek için aşağıdaki basit SELECT ifadesini çalıştırın. sonuç tablo.





SEÇME*KİMDEN sonuç;

Çıktı, dört öğrencinin üç dersten oluşan üç sınav türü için notlarını gösterir. Yani değerleri std_id , kurs kimliği ve mark_type farklı öğrenciler, dersler ve sınav türleri için birden çok kez tekrarlanır.



SELECT sorgusu CASE deyimi kullanılarak daha verimli bir şekilde yazılabilirse, çıktı daha okunabilir olacaktır. CASE deyimi ile aşağıdaki SELECT, satırların tekrar eden değerlerini sütun adlarına dönüştürecek ve tabloların içeriğini kullanıcı için daha anlaşılır bir biçimde görüntüleyecektir.

Sonuç.std_id, sonuç.ders_id SEÇ,
MAKS(DURUM NE ZAMAN sonuç.mark_type ='İç Sınav'SONRA sonuç.işaretleri SON) 'İç Sınav',
MAKS(DURUM NE ZAMAN sonuç.mark_type ='Vize'SONRA sonuç.işaretleri SON) 'Vize',
MAKS(DURUM NE ZAMAN sonuç.mark_type ='Final Sınavı'SONRA sonuç.işaretleri SON) 'Final Sınavı'
sonuçtan
GROUP BY sonuç.std_id, sonuç.course_id
SİPARİŞ BY sonuç.std_id, sonuç.course_id ASC;

Önceki çıktıdan daha okunabilir olan yukarıdaki ifadeyi çalıştırdıktan sonra aşağıdaki çıktı görünecektir.

CASE ve SUM() kullanarak satırları sütunlara döndürün:

Tablodan her öğrencinin her dersin toplam sayısını saymak istiyorsanız, toplama işlevini kullanmanız gerekir. TOPLA() gruplandırmak std_id ve kurs kimliği CASE ifadesi ile. Aşağıdaki sorgu, önceki sorguyu SUM() işlevi ve GROUP BY yan tümcesi ile değiştirerek oluşturulur.

Sonuç.std_id,sonuç.ders_id SEÇ,
MAKS(DURUM NE ZAMAN sonuç.mark_type ='İç Sınav'SONRA sonuç.işaretleri SON) 'İç Sınav',
MAKS(DURUM NE ZAMAN sonuç.mark_type ='Vize'SONRA sonuç.işaretleri SON) 'Vize',
MAKS(DURUM NE ZAMAN sonuç.mark_type ='Final Sınavı'SONRA sonuç.işaretleri SON) 'Final Sınavı',
TOPLA(sonuç.işaretleri) olarakToplam
sonuçtan
GROUP BY sonuç.std_id, sonuç.course_id
SİPARİŞ BY sonuç.std_id, sonuç.course_id ASC;

Çıktı, adlı yeni bir sütun gösterir. Toplam bu, her bir öğrencinin aldığı her dersin tüm sınav türlerinin puanlarının toplamını gösterir.

Birden çok tablodaki satırları sütunlara döndürün:

Önceki iki sorgu, sonuç tablo. Bu tablo diğer iki tablo ile ilişkilidir. Bunlar öğrenciler ve dersler . Öğrenci kimliği yerine öğrenci adını ve ders kimliği yerine ders adını görüntülemek istiyorsanız, ilgili üç tabloyu kullanarak SELECT sorgusunu yazmanız gerekir, öğrenciler , dersler ve sonuç . Aşağıdaki SELECT sorgusu, FORM yan tümcesinden sonra üç tablo adı eklenerek ve üç tablodan verileri almak ve önceki SELECT sorgularından daha uygun çıktılar üretmek için WHERE yan tümcesinde uygun koşullar ayarlanarak oluşturulur.

öğrencilerin adını SEÇolarak ``Öğrenci adı``, kurslar.adıolarak ``Kurs Adı``,
MAKS(DURUM NE ZAMAN sonuç.mark_type ='İç Sınav'SONRA sonuç.işaretleri SON) 'CT',
MAKS(DURUM NE ZAMAN sonuç.mark_type ='Vize'SONRA sonuç.işaretleri SON) 'Orta',
MAKS(DURUM NE ZAMAN sonuç.mark_type ='Final Sınavı'SONRA sonuç.işaretleri SON) 'Nihai',
TOPLA(sonuç.işaretleri) olarakToplam
Öğrencilerden, kurslardan, sonuç
NEREDE sonuç.std_id = öğrenciler.kimliği ve sonuç.course_id=ders.course_id
GROUP BY sonuç.std_id, sonuç.course_id
SİPARİŞ BY sonuç.std_id, sonuç.course_id ASC;

Yukarıdaki sorguyu yürüttükten sonra aşağıdaki çıktı üretilecektir.

Çözüm:

MySQL'deki Pivot() işlevinin desteği olmadan Pivot() işlevinin işlevselliğini nasıl uygulayabileceğiniz, bu makalede bazı yapay veriler kullanılarak gösterilmektedir. Umarım, okuyucular bu makaleyi okuduktan sonra SELECT sorgusunu kullanarak herhangi bir satır düzeyindeki verileri sütun düzeyinde verilere dönüştürebileceklerdir.