Raport filtrowany wstępnie po faktach
Posted by Marek Gregor on Listopad 13th, 2009
W mojej codziennej pracy spotykam się z wieloma problemami i pytaniami dotyczącymi tworzenia raportów. Jednym z nich dość ciekawym było pytanie: Dlaczego raport nie filtruje chociaż filtr ustawiony jest dość jasno a raport jest dość prosty. Po isię raportowi okazało się że użytkownik chciał pokazać sumę sprzedaży różnych oddziałów ale tylko takich produktów gdzie sprzedaż była znaczna tzn powyżej jakiejś wartości. Oto odwzorowanie tego problemu na schemacie SH. Załóżmy że chcemy zrobić raport sprzedaży dla regiony Ameryka dla produktów o znacznej sprzedaży tzn takich których suma sprzedaży w tych regionach przekroczyła 100000$ (nie interesuje nas drobnica). Na początek sprawdźmy jaka jest sprzedaż całkowita dla regionu Ameryki

i wynik

Zróbmy więc raport z filtrem 100000$ :

Na pierwszy rzut oka wydawałoby się że to jest to o co nam chodzi - sprawdźmy wynik:

Taki sam jak poprzednio – czy filtr nie działa? Oczywiście działa lecz ponieważ filtrujemy fakt to tak naprawdę najpierw dokonywana jest grupowanie szczegółów dla regionu ameryki a potem odfiltrowywane są te regiony które mają sprzedaż poniżej 100000$ (tutaj takich nie ma więc nic nie zostało odfiltrowane).
Aby zrobić poprawnie raport na filtrowanych wstępnie faktach mamy dwie metody:
1) użyć tabel przestawnych ( dobry ale czasami otrzemy się o limit rekordów dla tabel przestawnych)
2) użyć mechanizmu podraportów
Metoda 1
Wyciągamy szczegół na którego poziomie miałby byc zastosowany filtr dla sumy sprzedaży ( w naszym wypadku jak powiedzieliśmy wcześniej nie chcemy produktów gdzie sprzedaż była mniejsza niż 100000$ a więc jest to Nazwa produktu)

jak widać na wyniku odfiltrowaliśmy sprzedaż gdzie suma była mniejsza niż 100000$

ok ale my chcieliśmy tylko prosty wynik w postaci sumy całości a nie szczegóły. Sprawę załatwia prosty Pivot table czyli po naszemu tabela przestawna

Tak więc w ten prosty sposób uzyskaliśmy to o co nam chodziło – sumę sprzedaży dla regionu Ameryki produktów których wartość sprzedaży była większa niż 1000000$
Metoda 2
Tworzymy prosty raport z filtrami jak powyżej i zostawiamy tylko kolumnę nazwa produktu

zapisujemy go pod dowolną nazwą i przystępujemy do stworzenia raportu końcowego:
w którym filtrujemy nazwę produktu na podstawie wcześniej stworzonego wstępnego raportu w którym określiliśmy już kryteria filtrowania. Filtrowanie na podstawie zapisanego raportu można dokonać w okienku Filtrowania pod przyciskiem “Zaawansowane” – wybieramy raport i kolumnę której dotyczy filtrowanie

ostatecznie mamy

i poprawny wynik

Jak widać drugą metodą osiągnęliśmy ten sam rezultat . Użycie tabel przestawnych jest w zasadzie szybsze ale spotkałem się z sytuacją że analizowane były poszczególne transakcje które były filtrowane po fakcie i po odfiltrowaniu zostało ich tak wiele iż użytkownik otrzymał komunikat o przekroczeniu limitu rekordów ustawionego dla tabel przestawnych (które są notabene miniaturowymi kostkami OLAP) i w takim przypdku pozostało użycie metody 2.
Jeśli często filtrujemy po jakimś fakcie na poziomie wymiaru należało by sie zastanowić czy nie przeprojektować hurtownię/ repozytorium OBI EE (a w zasadzie jednego z jej wymiarów) tak by w tabeli wymiarów dla każdego rekordu przechowywać zagregowany na odpowiednim poziomie dany fakt po którym w łatwy sposób będzie można filtrować. W tym momencie ten sam fakt będziemy mieć w tabeli wymiarów (jako zagregowanie) i w tabeli faktów jako policzalny/sumowalny fakt .
Czuwaj