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