- Secara singkat tentang tabel Pivot
- Memutar data melalui alat (dbForge Studio untuk MySQL)
- Memutar data melalui SQL
- Contoh berbasis T-SQL untuk SQL Server
- Contoh untuk MySQL
- Mengotomatiskan pivoting data, membuat kueri secara dinamis
Secara singkat tentang tabel Pivot
Artikel ini membahas transformasi data tabel dari baris ke kolom. Transformasi seperti ini disebut tabel pivot. Seringkali, hasil dari pivot adalah tabel ringkasan di mana data statistik disajikan dalam bentuk yang sesuai atau diperlukan untuk sebuah laporan.
Selain itu, transformasi data tersebut dapat berguna jika database tidak dinormalisasi dan informasi disimpan di dalamnya dalam bentuk yang tidak optimal. Jadi, ketika mengatur ulang database dan mentransfer data ke tabel baru atau menghasilkan representasi data yang diperlukan, pivot data dapat membantu, yaitu memindahkan nilai dari baris ke kolom yang dihasilkan.
Di bawah ini adalah contoh tabel produk lama – Produk Lama dan yang baru – Produk Baru. Melalui transformasi dari baris ke kolom, hasil seperti itu dapat dengan mudah dicapai.
Berikut adalah contoh tabel pivot.
Memutar data melalui alat (dbForge Studio untuk MySQL)
Ada aplikasi yang memiliki alat yang memungkinkan untuk mengimplementasikan pivot data dalam lingkungan grafis yang nyaman. Misalnya, dbForge Studio untuk MySQL menyertakan fungsionalitas Tabel Pivot yang memberikan hasil yang diinginkan hanya dalam beberapa langkah.
Mari kita lihat contoh dengan tabel pesanan yang disederhanakan – PurchaseOrderHeader .
BUAT TABEL PurchaseOrderHeader ( PurchaseOrderID INT(11) NOT NULL, EmployeeID INT(11) NOT NULL, VendorID INT(11) NOT NULL, PRIMARY KEY (PurchaseOrderID));INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) NILAI (1 , 258, 1580);INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) NILAI (2, 254, 1496);INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) NILAI (3, 257, 1494);INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, EmployeeID ) NILAI (4, 261, 1650);MASUKKAN , EmployeeID, VendorID) NILAI (7, 255, 1678);INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) NILAI (8, 256, 1616);INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) NILAI (9, 259, 1492); INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) NILAI (10, 250, 1602);MASUKKAN PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) NILAI (11, 258, 1540);...
Asumsikan bahwa kita perlu membuat pilihan dari tabel dan menentukan jumlah pesanan yang dibuat oleh karyawan tertentu dari pemasok tertentu. Daftar karyawan yang memerlukan informasi – 250, 251, 252, 253, 254.
Tampilan laporan yang disukai adalah sebagai berikut.
Kolom kiri VendorID menunjukkan ID vendor; kolom Emp250 , Emp251 , Emp252 , Emp253 , dan Emp254 tampilkan jumlah pesanan.
Untuk mencapai ini di dbForge Studio untuk MySQL, Anda perlu:
- Tambahkan tabel sebagai sumber data untuk representasi 'Tabel Pivot' dari dokumen. Di Database Explorer, klik kanan PurchaseOrderHeader tabel dan pilih Kirim ke lalu Tabel Pivot di menu munculan.
- Tentukan kolom yang nilainya akan berupa baris. Seret VendorID kolom ke kotak 'Jatuhkan Baris Bidang Di Sini'.
- Tentukan kolom yang nilainya akan menjadi kolom. Seret KaryawanID kolom ke kotak 'Lepaskan Kolom Kolom Di Sini'. Anda juga dapat menyetel filter untuk karyawan yang dibutuhkan (250, 251, 252, 253, 254).
- Tentukan kolom, yang nilainya akan menjadi data. Seret PurchaseOrderID kolom ke kotak 'Lepaskan Item Data Di Sini'.
- Dalam properti PurchaseOrderID kolom, tentukan jenis agregasi – Jumlah nilai .
Kami segera mendapatkan hasil yang kami butuhkan.
Memutar data dengan menggunakan SQL
Tentu saja, transformasi data dapat dilakukan melalui database dengan menulis kueri SQL. Tetapi ada sedikit kendala, MySQL tidak memiliki pernyataan khusus yang memungkinkan untuk melakukan hal ini.
Contoh berbasis T-SQL untuk SQL Server
Misalnya, SqlServer dan Oracle memiliki operator PIVOT yang memungkinkan dilakukannya transformasi data tersebut. Jika kami bekerja dengan SqlServer, kueri kami akan terlihat seperti ini.
SELECT VendorID ,[250] AS Emp1 ,[251] AS Emp2 ,[252] AS Emp3 ,[253] AS Emp4 ,[254] AS Emp5FROM (SELECT PurchaseOrderID ,EmployeeID ,VendorID FROM Purchasing.PurchaseOrderHeader) pPIVOT( COUNT (PurchaseOrderID) UNTUK EmployeeID IN ([250], [251], [252], [253], [254])) SEBAGAI tORDER BY t.VendorID;
Contoh untuk MySQL
Di MySQL, kita harus menggunakan sarana SQL. Data harus dikelompokkan berdasarkan kolom vendor – VendorID , dan untuk setiap karyawan yang dibutuhkan (EmployeeID ), Anda perlu membuat kolom terpisah dengan fungsi agregat.
Dalam kasus kami, kami perlu menghitung jumlah pesanan, jadi kami akan menggunakan fungsi agregat COUNT.
Di tabel sumber, informasi tentang semua karyawan disimpan dalam satu kolom EmployeeID , dan kita perlu menghitung jumlah pesanan untuk karyawan tertentu, jadi kita perlu mengajarkan fungsi agregat kita untuk memproses hanya baris tertentu.
Fungsi agregat tidak memperhitungkan nilai NULL, dan kami menggunakan kekhasan ini untuk tujuan kami.
Anda dapat menggunakan operator bersyarat IF atau CASE yang akan mengembalikan nilai tertentu untuk karyawan yang diinginkan, jika tidak, hanya akan mengembalikan NULL; akibatnya, fungsi COUNT hanya akan menghitung nilai non-NULL.
Query yang dihasilkan adalah sebagai berikut:
PILIH VendorID, COUNT(IF(EmployeeID =250, PurchaseOrderID, NULL)) AS Emp250, COUNT(IF(EmployeeID =251, PurchaseOrderID, NULL)) AS Emp251, COUNT(IF(EmployeeID =252, PurchaseOrderID, NULL) ) AS Emp252, COUNT(IF(EmployeeID =253, PurchaseOrderID, NULL)) AS Emp253, COUNT(IF(EmployeeID =254, PurchaseOrderID, NULL)) AS Emp254FROM PurchaseOrderHeader pWHERE p.EmployeeID ANTARA 250 DAN 254GROUP MENURUT Vendor>Atau bahkan seperti ini:
VendorID, COUNT(IF(EmployeeID =250, 1, NULL)) AS Emp250, COUNT(IF(EmployeeID =251, 1, NULL)) AS Emp251, COUNT(IF(EmployeeID =252, 1, NULL)) AS Emp252, COUNT(IF(EmployeeID =253, 1, NULL)) AS Emp253, COUNT(IF(EmployeeID =254, 1, NULL)) AS Emp254FROM PurchaseOrderHeader pWHERE p.EmployeeID ANTARA 250 DAN 254GROUP BY VendorID;Saat dieksekusi, hasil yang familiar diperoleh.
Mengotomatiskan pivot data, membuat kueri secara dinamis
Seperti yang dapat dilihat, kueri memiliki konsistensi tertentu, yaitu semua kolom yang diubah dibentuk dengan cara yang sama, dan untuk menulis kueri, Anda perlu mengetahui nilai spesifik dari tabel. Untuk membentuk kueri pivot, Anda perlu meninjau semua nilai yang mungkin dan baru setelah itu Anda harus menulis kueri. Atau, Anda dapat meneruskan tugas ini ke server yang menyebabkannya memperoleh nilai-nilai ini dan secara dinamis melakukan tugas rutin.
Mari kembali ke contoh pertama, di mana kita membentuk tabel baru ProductsNew dari ProductsOld meja. Di sana, nilai properti terbatas, dan kami bahkan tidak dapat mengetahui semua nilai yang mungkin; kami hanya memiliki informasi di mana nama properti dan nilainya disimpan. Ini adalah Properti dan Nilai kolom, masing-masing.
Seluruh algoritme pembuatan kueri SQL diturunkan untuk memperoleh nilai, dari mana kolom baru dan rangkaian bagian kueri yang tidak dapat diubah akan dibentuk.
SELECT GROUP_CONCAT( CONCAT( ' MAX(IF(Property =''', t.Property, ''', Value, NULL)) AS ', t.Property ) ) INTO @PivotQueryFROM (SELECT Property FROM ProductOld GROUP BY Properti) t;SET @PivotQuery =CONCAT('SELECT ProductID,', @PivotQuery, ' FROM ProductOld GROUP BY ProductID');Variabel @PivotQuery akan menyimpan kueri kita, teks telah diformat untuk kejelasan.
SELECT ProductID, MAX(IF(Property ='Color', Value, NULL)) AS Color, MAX(IF(Property ='Name', Value, NULL)) AS Name, MAX(IF(Property ='ProductNumber ', Nilai, NULL)) AS ProductNumber, MAX(IF(Property ='Size', Value, NULL)) AS Size, MAX(IF(Property ='SizeUnitMeasureCode', Value, NULL)) AS SizeUnitMeasureCodeFROM ProductOldGROUP BY ProductIDSetelah menjalankannya, kami akan mendapatkan hasil yang diinginkan sesuai dengan skema tabel ProductsNew.
Terlebih lagi, kueri dari variabel @PivotQuery dapat dieksekusi dalam skrip menggunakan pernyataan MySQL EXECUTE.SIAPKAN pernyataan FROM @PivotQuery;Jalankan pernyataan;DEALLOCATE SIAPKAN pernyataan;