czwartek, 7 listopada 2013

Klauzula grouping w SQL

 Grouping



Przy używaniu klauzul Rollup czy Cube powstaje jeden problem. Jak odróżnić które Nulle w wierszach wynikają z tego że dany wiersz to podsumowanie, a które nulle to brak danych? Objawia się ten problem zwłaszcza jeśli wynik posortujemy w taki sposób że podsumowania nie są na dole.
Zobrazujmy to przykładem:



select manager_Id,department_id,count(*), round(avg(salary))
from employees

group by rollup(department_id,manager_id);






















Podświetliłem agregację dla wartości 90 w department_id. Który z dwóch wierszy w których występuje null w kolumnie manager_id to ten z podsumowaniem?

Ten problem rozwiązuje nam zastosowanie klauzuli GROUPING :



select grouping(department_id),grouping(manager_id) ,
manager_Id,department_id,count(*), round(avg(salary)) from employees
group by rollup(department_id,manager_id);



Klauzulę GROUPING stosujemy wobec kolumn wg których grupujemy. Grouping zwróci nam wartość 0 albo 1 w zależności od tego czy dany wiersz zawiera podsumowanie czy nie.

 
Na powyższym przykładzie w najniższym z trzech zaznaczonych wierszy w kolumnie powstałej dzięki „grouping(manager_id)” widzimy wartość 1. To oznacza że null w kolumnie „manager_id” wynika z podsumowania, a nie z braku danych.


Brak komentarzy:

Prześlij komentarz