Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Memahami Fungsi GROUPING dan GROUPING_ID di SQL Server

Operator ROLLUP dan CUBE digunakan untuk mengembalikan hasil yang dikumpulkan oleh kolom dalam klausa GROUP BY.

Fungsi GROUPING dan GROUPING_ID digunakan untuk mengidentifikasi apakah kolom dalam daftar GROUP BY digabungkan (menggunakan operator ROLLUP atau CUBE) atau tidak.

Ada dua perbedaan utama antara Fungsi GROUPING dan GROUPING_ID.

Mereka adalah sebagai berikut:

  • Fungsi GROUPING dapat diterapkan pada satu kolom, sedangkan daftar kolom untuk fungsi GROUPING_ID harus sesuai dengan daftar kolom dalam klausa GROUP BY.
  • Fungsi GROUPING menunjukkan apakah kolom dalam daftar GROUP BY diagregasi atau tidak. Ini mengembalikan 1 jika kumpulan hasil diagregasi, dan 0 jika kumpulan hasil tidak diagregasi.

Di sisi lain, fungsi GROUPING_ID juga mengembalikan bilangan bulat. Namun, ia melakukan konversi biner ke desimal setelah menggabungkan hasil dari semua fungsi GROUPING.

Dalam artikel ini, kita akan melihat fungsi GROUPING dan GROUPING_ID beraksi dengan bantuan contoh.

Menyiapkan Beberapa Data Dummy

Seperti biasa, mari kita buat beberapa data dummy yang akan kita gunakan sebagai contoh yang akan kita kerjakan di artikel ini.

Jalankan script berikut:

CREATE Database company;

 USE company;

CREATE TABLE employee
(
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender VARCHAR(50) NOT NULL,
    salary INT NOT NULL,
    department VARCHAR(50) NOT NULL
 )

 INSERT INTO employee 

VALUES
(1, 'David', 'Male', 5000, 'Sales'),
(2, 'Jim', 'Female', 6000, 'HR'),
(3, 'Kate', 'Female', 7500, 'IT'),
(4, 'Will', 'Male', 6500, 'Marketing'),
(5, 'Shane', 'Female', 5500, 'Finance'),
(6, 'Shed', 'Male', 8000, 'Sales'),
(7, 'Vik', 'Male', 7200, 'HR'),
(8, 'Vince', 'Female', 6600, 'IT'),
(9, 'Jane', 'Female', 5400, 'Marketing'),
(10, 'Laura', 'Female', 6300, 'Finance'),
(11, 'Mac', 'Male', 5700, 'Sales'),
(12, 'Pat', 'Male', 7000, 'HR'),
(13, 'Julie', 'Female', 7100, 'IT'),
(14, 'Elice', 'Female', 6800,'Marketing'),
(15, 'Wayne', 'Male', 5000, 'Finance')

Dalam skrip di atas, kami telah membuat database bernama "Perusahaan". Kami kemudian telah membuat tabel "Karyawan" dalam database Perusahaan. Akhirnya, kami telah memasukkan beberapa catatan dummy ke dalam tabel Karyawan.

Fungsi PENGELOLAAN

Seperti disebutkan di atas, fungsi GROUPING mengembalikan 1 jika kumpulan hasil diagregasi, dan 0 jika kumpulan hasil tidak diagregasi.

Lihat skrip berikut untuk melihat fungsi GROUPING beraksi.

SELECT  
department AS Department, 
gender AS Gender, 
sum(salary) as Salary_Sum,
GROUPING(department) as GP_Department,
GROUPING(gender) as GP_Gender
FROM employee
GROUP BY ROLLUP (department, gender)

Script di atas menghitung jumlah gaji seluruh pegawai laki-laki dan perempuan, yang dikelompokan terlebih dahulu menurut kolom Departemen kemudian kolom Gender. Dua kolom lagi ditambahkan untuk menampilkan hasil fungsi GROUPING yang diterapkan ke Departemen dan kolom Gender.

Operator ROLLUP digunakan untuk menampilkan jumlah gaji dalam bentuk grand total dan subtotal.

Output dari script di atas terlihat seperti ini.

Perhatikan baik-baik outputnya. Jumlah gaji ditampilkan menurut jenis kelamin menurut jenis kelamin departemen (baris 1, 2, 4, 5, 7, 9, 10, dan 12). Kemudian juga diagregasi berdasarkan jenis kelamin saja (baris 3, 6, 8, 11, dan 13). Terakhir, total gaji yang dikumpulkan oleh Departemen dan Gender ditampilkan di baris 14.

1 ditampilkan pada kolom fungsi GROUPING GP_Gender untuk baris yang hasilnya diagregasi berdasarkan gender yaitu baris 3, 6, 8, 11, dan 13. Hal ini dikarenakan kolom GP_Gender berisi hasil fungsi GROUPING yang diterapkan pada kolom Gender.

Demikian pula, baris 14 berisi jumlah agregat dari semua departemen dan semua kolom. Oleh karena itu 1 dikembalikan untuk kolom GP_Department dan GP_Gender.

Anda dapat melihat NULL ditampilkan di kolom Departemen dan Gender di output di mana hasil dikumpulkan. Misalnya pada baris 3, NULL ditampilkan di kolom Gender karena hasilnya diagregasi berdasarkan kolom gender sehingga tidak ada nilai kolom untuk ditampilkan. Kami tidak ingin pengguna kami melihat NULL, kata yang lebih baik di sini adalah “Semua jenis kelamin”.

Untuk melakukan ini, kita harus memodifikasi skrip kita sebagai berikut:

SELECT  
	CASE WHEN GROUPING(department) = 1 THEN 'All Departments' ELSE ISNULL(department, 'Unknown') END as Department,
	CASE WHEN GROUPING(gender) = 1 THEN 'All Genders' ELSE ISNULL(gender, 'Unknown') END as Gender,
	sum(salary) as Salary_Sum
FROM employee
GROUP BY ROLLUP (department, gender)

Pada script di atas, jika fungsi GROUPING diterapkan ke kolom Departemen menghasilkan 1 dan “Semua Departemen” ditampilkan di kolom Departemen. Sebaliknya, jika kolom Departemen berisi nilai NULL, maka akan ditampilkan “Tidak Diketahui”. Kolom gender telah dimodifikasi dengan cara yang sama.

Menjalankan skrip di atas mengembalikan hasil berikut:

Anda dapat melihat bahwa NULL di kolom Departemen dan Gender tempat fungsi GROUPING mengembalikan 1, masing-masing telah diganti dengan “Semua Departemen” dan “Semua Gender”.

Fungsi GROUPING_ID

Fungsi GROUPING_ID menggabungkan output dari fungsi GROUPING yang diterapkan ke semua kolom yang ditentukan dalam klausa GROUP BY. Kemudian melakukan konversi biner ke desimal sebelum mengembalikan hasil akhir.

Mari kita gabungkan dulu output yang dikembalikan oleh fungsi GROUPING yang diterapkan ke kolom Departemen dan Gender. Perhatikan script berikut:

USE company
SELECT  
department AS Department, 
gender AS Gender, 
sum(salary) as Salary_Sum,
CAST(GROUPING(department) AS VARCHAR(1)) +
CAST(GROUPING(gender) AS VARCHAR (1))  as Grouping
FROM employee
GROUP BY ROLLUP (department, gender)

Di output, Anda akan melihat 0s dan 1s dikembalikan oleh fungsi GROUPING yang digabungkan bersama. Outputnya terlihat seperti ini:

Fungsi GROUPING_ID hanya mengembalikan ekuivalen desimal dari nilai biner yang terbentuk sebagai hasil penggabungan nilai yang dikembalikan oleh fungsi GROUPING.

Jalankan skrip berikut untuk melihat fungsi GROUPING ID beraksi:

USE company
SELECT  
department AS Department, 
gender AS Gender, 
sum(salary) as Salary_Sum,
CAST(GROUPING(department) AS VARCHAR(1)) +
CAST(GROUPING(gender) AS VARCHAR (1))  as Grouping,
GROUPING_ID(department, gender) as Grouping_Id
FROM employee
GROUP BY ROLLUP (department, gender)

Untuk baris 1, fungsi GROUPING ID akan mengembalikan 0 karena ekuivalen desimal dari '00' adalah nol.

Untuk baris 3, 6, 8, 11 dan 13, fungsi GROUPING_ID mengembalikan 1 karena ekuivalen desimal dari '01' adalah 1.

Terakhir, untuk baris 14, fungsi GROUPIND_ID mengembalikan 3, karena ekuivalen biner dari '11' adalah 3.

Output dari script di atas terlihat seperti ini:

Lihat Juga:

Microsoft:Ikhtisar Grouping_ID

Microsoft:Ikhtisar Pengelompokan

YouTube:Pengelompokan &Pengelompokan_ID


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Anda menghitung jumlah kemunculan substring tertentu dalam varchar SQL?

  2. Bagaimana cara melakukan IF...THEN dalam SQL SELECT?

  3. Apa yang dimaksud dengan kunci baris, halaman, dan tabel? Dan kapan mereka diakuisisi?

  4. Temukan objek yang rusak di SQL Server

  5. Periksa Apakah Tabel Memiliki Kunci Asing di SQL Server dengan OBJECTPROPERTY()