Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zrozumienie funkcji GROUPING i GROUPING_ID w programie SQL Server

Operatory ROLLUP i CUBE służą do zwracania wyników zagregowanych według kolumn w klauzuli GROUP BY.

Funkcje GROUPING i GROUPING_ID służą do identyfikowania, czy kolumny na liście GROUP BY są agregowane (przy użyciu operatorów ROLLUP lub CUBE), czy nie.

Istnieją dwie główne różnice między funkcjami GROUPING i GROUPING_ID.

Są one następujące:

  • Funkcja GROUPING ma zastosowanie do pojedynczej kolumny, podczas gdy lista kolumn dla funkcji GROUPING_ID musi być zgodna z listą kolumn w klauzuli GROUP BY.
  • Funkcja GRUPOWANIE wskazuje, czy kolumna na liście GROUP BY jest agregowana, czy nie. Zwraca 1, jeśli zestaw wyników jest zagregowany, i 0, jeśli zestaw wyników nie jest zagregowany.

Z drugiej strony funkcja GROUPING_ID zwraca również liczbę całkowitą. Jednak wykonuje konwersję binarną na dziesiętną po połączeniu wyników wszystkich funkcji GRUPOWANIA.

W tym artykule przyjrzymy się działaniu funkcji GROUPING i GROUPING_ID za pomocą przykładów.

Przygotowywanie niektórych fikcyjnych danych

Jak zawsze, stwórzmy fałszywe dane, których użyjemy w przykładzie, z którym będziemy pracować w tym artykule.

Wykonaj następujący skrypt:

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')

W powyższym skrypcie stworzyliśmy bazę danych o nazwie „Firma”. Następnie utworzyliśmy tabelę „Pracownik” w bazie danych firmy. Na koniec wstawiliśmy kilka fikcyjnych rekordów do tabeli Pracownik.

Funkcja GRUPOWANIE

Jak wspomniano powyżej, funkcja GRUPOWANIE zwraca 1, jeśli zestaw wyników jest zagregowany, i 0, jeśli zestaw wyników nie jest zagregowany.

Spójrz na poniższy skrypt, aby zobaczyć działanie funkcji GRUPOWANIE.

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)

Powyższy skrypt zlicza sumę wynagrodzeń wszystkich pracowników płci męskiej i żeńskiej, które są pogrupowane najpierw według kolumny Departament, a następnie według kolumny Płeć. Dodano dwie dodatkowe kolumny, aby wyświetlić wynik funkcji GRUPOWANIA zastosowanej do kolumn Departamentu i Płeć.

Operator ROLLUP służy do wyświetlania sumy wynagrodzeń w postaci sum całkowitych i sum częściowych.

Wynik powyższego skryptu wygląda tak.

Przyjrzyj się uważnie wynikom. Suma wynagrodzeń jest wyświetlana według płci według płci działu (wiersze 1, 2, 4, 5, 7, 9, 10 i 12). Następnie jest agregowany tylko według płci (wiersze 3, 6, 8, 11 i 13). Na koniec w wierszu 14 wyświetlana jest łączna suma wynagrodzeń zagregowanych według działu i płci.

1 jest wyświetlane w kolumnie funkcji GRUPOWANIE GP_Płeć dla wierszy, w których wyniki są agregowane według płci, tj. wiersze 3, 6, 8, 11 i 13. Dzieje się tak, ponieważ kolumna GP_Płeć zawiera wynik funkcji GRUPOWANIE zastosowanej do kolumny Płeć.

Podobnie wiersz 14 zawiera zagregowaną sumę wszystkich działów i wszystkich kolumn. Dlatego zwracane jest 1 dla obu kolumn GP_Department i GP_Gender.

Możesz zobaczyć, że NULL jest wyświetlane w kolumnach Dział i Płeć w danych wyjściowych, w których wyniki są agregowane. Na przykład w wierszu 3 w kolumnie Płeć jest wyświetlana wartość NULL, ponieważ wyniki są agregowane według kolumny płci, a zatem nie ma wartości kolumny do wyświetlenia. Nie chcemy, aby nasi użytkownicy widzieli NULL, lepszym słowem byłoby tutaj „Wszystkie płcie”.

Aby to zrobić, musimy zmodyfikować nasz skrypt w następujący sposób:

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)

W powyższym skrypcie, jeśli funkcja GRUPOWANIA zastosowana do kolumny Dział zwraca 1, a w kolumnie Dział jest wyświetlany komunikat „Wszystkie działy”. W przeciwnym razie, jeśli kolumna Dział zawiera wartość NULL, wyświetli się „Nieznany”. Kolumna płci została zmodyfikowana w ten sam sposób.

Uruchomienie powyższego skryptu zwraca następujące wyniki:

Widać, że wartość NULL w kolumnach Dział i Płeć, w których funkcja GRUPOWANIE zwraca 1, została zastąpiona odpowiednio przez „Wszystkie działy” i „Wszystkie płcie”.

Funkcja GROUPING_ID

Funkcja GROUPING_ID łączy dane wyjściowe funkcji GROUPING stosowanych do wszystkich kolumn określonych w klauzuli GROUP BY. Następnie wykonuje konwersję binarną na dziesiętną przed zwróceniem końcowego wyniku.

Najpierw połączmy dane wyjściowe zwrócone przez funkcję GRUPOWANIE zastosowaną do kolumn Dział i Płeć. Spójrz na następujący skrypt:

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)

W danych wyjściowych zobaczysz połączone zer i jedynek zwrócone przez funkcję GRUPOWANIE. Wynik wygląda tak:

Funkcja GROUPING_ID po prostu zwraca dziesiętny odpowiednik wartości binarnej utworzonej w wyniku połączenia wartości zwracanych przez funkcje GROUPING.

Wykonaj następujący skrypt, aby zobaczyć, jak działa funkcja GROUPING ID:

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)

W wierszu 1 funkcja GROUPING ID zwróci 0, ponieważ dziesiętny odpowiednik „00” to zero.

W przypadku wierszy 3, 6, 8, 11 i 13 funkcja GROUPING_ID zwraca 1, ponieważ dziesiętny odpowiednik „01” to 1.

Wreszcie dla wiersza 14 funkcja GROUPIND_ID zwraca 3, ponieważ binarny odpowiednik „11” to 3.

Wynik powyższego skryptu wygląda tak:

Zobacz też:

Microsoft:Przegląd Grouping_ID

Microsoft:przegląd grupowania

YouTube:grupowanie i identyfikator grupowania


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Milisekundy w moim DateTime zmieniają się, gdy są przechowywane w SQL Server

  2. Co to jest Multi Dimension OLAP CUBE i podaj przykładową kostkę z więcej niż 3 wymiarami

  3. Wybierz kolumny z zestawu wyników procedury składowanej

  4. Jak WYBRAĆ Z procedury składowanej

  5. Wysyłaj wiadomości e-mail z załącznikami w SQL Server (T-SQL)