Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Dapatkan hitungan kategori tertentu dan subkategori bercabang lebih lanjut menggunakan kueri SQL

Grup MySQL dengan dukungan WITH ROLLUP yang akan memberikan agregasi yang lebih luas untuk Anda:

Misalkan tabel karyawan Anda seperti:

Name, Role, Gender
John, Manager, Male
Susie, Manager, Female
...

Kueri seperti ini:

SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role

Akan menghasilkan familiar:

Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20

dll

Sekarang, jika kita menambahkan WITH ROLLUP:

SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP

Kemudian MySQL juga akan mengabaikan Role dan hanya mengelompokkan Gender:

Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
Male, NULL, 29

Baris peran NULL adalah baris di mana semua peran disatukan dan hitungannya adalah total Pria. ROLLUP berguling dari kanan ke kiri, jadi jika Anda GROUP BY a,b,c,d WITH ROLLUP Anda akan mendapatkan baris tambahan untuk "semua a,b,c", "semua a,b" dan "semua a" - jadi urutan yang Anda masukkan Gender dan Peran dalam Grup Anda adalah penting!

Terakhir, jika Anda ingin melakukan sedikit pembentukan ulang data sehingga Anda hanya memiliki satu kolom teks, seperti contoh Anda:

SELECT COALESCE(Role, Gender) as Desc, Ctr
(
  SELECT Gender, Role, COUNT(*) as Ctr
  FROM employee
  GROUP BY Gender, Role WITH ROLLUP
) x --need to use a subquery - see manual
ORDER BY Gender, Role

Tetapi perhatikan bahwa jika Anda melakukan ini, Anda akan mengalami masalah karena tidak ada yang tersisa untuk secara konkret membedakan baris "Manajer" pria dari baris "Manajer" wanita; itu murni bergantung pada pesanan, dan itu bukan ide bagus; itu sebabnya kami biasanya meninggalkan subtotal dengan cara ini ke ujung depan, sehingga paket laporan akan menyimpan data bersama. Jika Anda melakukan sesuatu seperti mengonversi ini ke JSON, mengirimkannya ke komputer jarak jauh dan pemesanannya hilang, infonya menjadi tidak berarti. Secara pribadi saya akan melakukan sesuatu yang lebih seperti:

SELECT Gender, COALESCE(Role, '(TOTAL)') as Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP

Itu menyimpan data manajer pria, dan manajer wanita di baris sehingga Anda dapat membedakannya, tetapi itu mengubah NULL menjadi (Total) untuk lebih memberikan info tentang apa itu

Ada hal lain untuk didiskusikan seperti bagaimana jika kolom berisi nilai NULL itu sendiri, tetapi saya akan mengarahkan Anda ke The Fine Manual untuk itu:https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:pilih 5 baris sebelum dan sesudah baris tertentu

  2. cara mengelompokkan dan menghitung menggunakan MySQL

  3. MySQL Memuat Data Infile

  4. Cara menambahkan Kunci Asing (MySQL)

  5. Mengonversi string ke tipe DECIMAL mySql