Przypisywanie reguły agregacji na potrzeby podsumowań w raportach

W tym temacie opisano sposoby jawnego przypisywania reguły agregacji na potrzeby podsumowań w raportach, co pomaga poprawić wydajność i jest przeznaczone specjalnie dla programistów technicznych sporządzających raporty za pomocą Oracle Analytics.

Na poniższym rysunku pokazano przykład, gdzie definicja raportu to rok, miesiąc i region klienta, a miara to Licznik dystynktywny klientów z zamówieniami, która jest zdefiniowana jako licznik dystynktywny klientów z zamówieniami.

Opis "GUID-4E9DB43C-F827-4BBB-A94D-5A91F3626C72-default.jpg" znajduje się poniżej
.jpg"

Zapytanie logiczne wygląda następująco:

SELECT
   0 s_0,
   "A - Sample Sales"."Cust Regions"."C50  Region" s_1,
   "A - Sample Sales"."Counts"."32  # of Cust with Orders  (Cnt Distinct)" s_2,
   REPORT_AGGREGATE("A - Sample Sales"."Counts"."32  # of Cust with Orders  (Cnt Distinct)" BY ) s_3
FROM "A - Sample Sales"
WHERE
("Time"."T02 Per Name Month" = '2011 / 11')
ORDER BY 2 ASC NULLS LAST
FETCH FIRST 500001 ROWS ONLY

Wygenerowane zapytanie fizyczne wygląda następująco:

WITH
SAWITH0 AS (select count(distinct T42433.Cust_Key) as c1,
     T42430.Region as c2
from
     BISAMPLE.SAMP_CUSTOMERS_D T42428 /* D60 Customers */ ,
     BISAMPLE.SAMP_ADDRESSES_D T42430 /* D62 Customers Addresses */ ,
     BISAMPLE.SAMP_TIME_MTH_D T42405 /* D02 Time Month Grain */ ,
     BISAMPLE.SAMP_REVENUE_F T42433 /* F10 Billed Rev */
where  ( T42405.Mth_Key = T42433.Bill_Mth_Key and T42405.Per_Name_Month = '2011 / 11' and T42428.Cust_Key = T42433.Cust_Key and T42428.Address_Key = T42430.Address_Key )
group by T42430.Region),
SAWITH1 AS (select count(distinct T42433.Cust_Key) as c1
from
     BISAMPLE.SAMP_TIME_MTH_D T42405 /* D02 Time Month Grain */ ,
     BISAMPLE.SAMP_REVENUE_F T42433 /* F10 Billed Rev */
where  ( T42405.Per_Name_Month = '2011 / 11' and T42405.Mth_Key = T42433.Bill_Mth_Key ) )
select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4 from ( select D1.c1 as c1,
     D1.c2 as c2,
     D1.c3 as c3,
     D1.c4 as c4
from
     (select 0 as c1,
               D1.c2 as c2,
               D1.c1 as c3,
               D2.c1 as c4,
               ROW_NUMBER() OVER (PARTITION BY D1.c2 ORDER BY D1.c2 ASC) as c5
          from
               SAWITH0 D1,
               SAWITH1 D2
     ) D1
where  ( D1.c5 = 1 )
order by c2 ) D1 where rownum <= 500001

Łączna wartość 480 jest sumą wartości składowych: 182 + 113 + 185. Wyrażenie zapytania logicznego służące do obliczania sumy to: "REPORT_AGGREGATE("A - Sample Sales"."Counts"."32 # of Cust with Orders (Cnt Distinct)" BY ) s_3".

Gdy używana jest wartość REPORT_AGGREGATE, suma będzie obliczana niezależnie od wartości elementów składowych. Jednak w przypadku tego projektu raportu poprawną sumę można obliczyć na podstawie elementów składowych raportu.

Jeśli użytkownik dokona edycji formuły kolumny, zmieniając opcję Reguła agregacji (wiersz podsumowań) ze Złożona agregacja przez serwer na Suma, logiczne i fizyczne zapytanie SQL zostanie zmienione.

Na poniższym rysunku pokazano pierwotną agregację.

Opis "GUID-96FB697B-24F7-41A9-8678-F99921E5BB19-default.png" znajduje się poniżej
.png"

Na poniższym rysunku pokazano zmodyfikowaną agregację.

Opis "GUID-ED289D12-C0BD-4588-B288-2069EAB3EB1D-default.png" znajduje się poniżej
.png"

Zmodyfikowane zapytanie logiczne SQL zawiera teraz REPORT_SUM:

SELECT
   0 s_0,
   "A - Sample Sales"."Cust Regions"."C50  Region" s_1,"A - Sample Sales"."Counts"."32  # of Cust with Orders  (Cnt Distinct)" s_2,
   REPORT_SUM("A - Sample Sales"."Counts"."32  # of Cust with Orders  (Cnt Distinct)" BY ) s_3
FROM "A - Sample Sales"
WHERE
("Time"."T02 Per Name Month" = '2011 / 11')
ORDER BY 2 ASC NULLS LAST
FETCH FIRST 500001 ROWS ONLY

Oto wygenerowane zapytanie fizyczne:

WITH
SAWITH0 AS (select count(distinct T42433.Cust_Key) as c1,
     T42430.Region as c2
from
     BISAMPLE.SAMP_CUSTOMERS_D T42428 /* D60 Customers */ ,
     BISAMPLE.SAMP_ADDRESSES_D T42430 /* D62 Customers Addresses */ ,
     BISAMPLE.SAMP_TIME_MTH_D T42405 /* D02 Time Month Grain */ ,
     BISAMPLE.SAMP_REVENUE_F T42433 /* F10 Billed Rev */
where  ( T42405.Mth_Key = T42433.Bill_Mth_Key and T42405.Per_Name_Month = '2011 / 11' and T42428.Cust_Key = T42433.Cust_Key and T42428.Address_Key = T42430.Address_Key )
group by T42430.Region),
SAWITH1 AS (select 0 as c1,
     D1.c2 as c2,
     D1.c1 as c3
from
     SAWITH0 D1)
select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4 from ( select D1.c1 as c1,
     D1.c2 as c2,
     D1.c3 as c3,
     sum(D1.c3) over ()  as c4
from
     SAWITH1 D1
order by c2 ) D1 where rownum <= 500001

Ta sama opcja umożliwiająca jawne ustawienie agregacji jest dostępna w skoroszytach. Zob. Formatowanie wartości liczbowych w wizualizacjach. W tym przykładzie należy dla kolumny "Licznik dystynktywny klientów z zamówieniami" zmienić wartość opcji Metoda agregacji na Suma.

Należy przejrzeć raporty, aby upewnić się, że używane są w nich najlepsze reguły agregacji. Jeśli projekt raportu na to pozwala, należy użyć jawnej reguły agregacji.

Więcej informacji na temat raportów można znaleźć w części Tworzenie analiz.