Sunteți pe pagina 1din 5

Funcii OLAP

Pentru ilustrarea acestor funcii utilizm tabela VINZRI_CRI care, pentru o editur, conine informaii despre facturile emise - crile vndute librriilor i/sau distribuitorilor de carte i pres. 1.Creare tabele CREATE TABLE vinzari_carti ( NrFact DECIMAL(6) NOT NULL, DataFact DATE NOT NULL, Client VARCHAR(15), Loc VARCHAR(15), Jud CHAR(2), ISBN CHAR(9), Cantit DECIMAL (6), PretUn DECIMAL (8), ValTotala DECIMAL (14) ); 2.Inserare valori insert into vinzari_carti values(12,'2/2/00','alfa','lugoj','tm',111,42,423424,5225235); insert into vinzari_carti values(12,'2/2/00','alfa','lugoj','ar',111,42,423424,5225235); insert into vinzari_carti values(13,'2/2/00','beta,'lugoj','tm',112,4,423424,5225235); insert into vinzari_carti values(14,'2/2/00','alfa','timisoara','tm',12,42,423424,5225235); insert into vinzari_carti values(14,'2/2/00','alfa','timisoara','tm',12,42,423424,4444444); insert into vinzari_carti values(15,'2/2/00','beta','deva','hd',131,2,423424,5225235); insert into vinzari_carti values(15,'2/2/00','beta','deva','hd',131,2,423424,22222); insert into vinzari_carti values(16,'2/2/00','teta','deva','hd',1211,32,423424,5225235); insert into vinzari_carti values(15,'2/2/00','teta','deva','hd',1111,42,423424,5225235); insert into vinzari_carti values(16,'2/2/00','teta','deva','hd',114,12,423424,5225235); 3. ROLLUP Prima funcie luat n discuie este ROLLUP. Se folosete pentru analiza datelor pe o singur dimensiune, dar la mai multe nivele de detaliere, atunci cnd n rapoarte sunt necesare subtotaluri incluse n alte subtotaluri, precum i un total general. Problema creia vrem s-i dm rspuns se formuleaz astfel: Care este totalul vnzrilor de carte, pe clieni, localiti i judee, precum i totalul general ? 1

Astfel de analize sunt ct se poate de frecvente i necesare pentru toate tipurile de firme. n lipsa unui operator de genul ROLLUP, soluia necesit reuniunea (UNION) SELECT jud, loc, client, SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud, loc, client UNION SELECT jud, loc, ' Subtotal LOCALITATE ' ||loc, SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud, loc UNION SELECT jud, ' Subtotal JUDET '||jud, ' ', SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud UNION SELECT ' ', 'TOTAL GENERAL ', ' ', SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti ; 4. Att interogarea, ct i ecranul de rspuns sunt specifice Oracle, dar formularea acesteia n DB2 nu ridic dificulti deosebite. De obicei, subtotalurile i totalul general sunt afiate dup fiecare grup, respectiv pe ultima linie a rezultatului, n timp ce interogarea precedent plaseaz subtotalul la nceput. Plasarea normal (la sfritul grupului) necesit utilizarea unui caracter cu un cod ASCII suficient de mare pentru ca linia respectiv s fie ultima din grup SELECT jud, loc, client, SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud, loc, client UNION SELECT jud, loc, CHR(123)||' Subtotal LOCALITATE ' ||loc, SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud, loc UNION SELECT jud, CHR(123)||' Subtotal JUDET '||jud, ' ',

SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud UNION SELECT CHR(123)||' ', 'TOTAL GENERAL ', ' ', SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti ; 5. Cu operatorul ROLLUP asemenea operaiuni devin grozav de lesnicioase SELECT jud, loc, client, SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY ROLLUP(jud, loc, client) ; Se calculeaz valoarea funciei SUM pentru atributul cel mai din dreapta al ROLLUP-ului Client (acesta se consider a fi primul subtotal), apoi cte un subtotal pentru Loc, pentru Jud i, n final, totalul general. n total sunt 3 + 1 = 4 nivele de (sub)totalizare, 3 pentru cele trei atribute plus totalul general. 6. Combinarea funciilor ROLLUP i GROUPING SELECT jud, Loc, Client, SUM(ValTotala) AS Val_Vinzari, GROUPING (Jud) AS Grup_Jud, GROUPING (Loc) AS Grup_Loc, GROUPING (Client) AS Grup_Client FROM vinzari_carti GROUP BY ROLLUP(jud, loc, client) ORDER BY jud, loc, client ;

7. CUBE O analiz care se respect este, totui, una multi-dimensional. Dac singura ax de (subtotalizare) a fost, n exemplele de pn acum, cea geografic, n continuare ne intereseaz s vizualizm vnzrile pe dou axe, produse i clieni. ntruct produse i clieni sunt dou variabile independente, vor exista patru variante de grupare a datelor: grupare dup client i produs, grupare numai dup client,

grupare numai dup produs i un grup de total general. O soluie bazat pe CUBE este ct se poate de simpl i direct. SELECT client, ISBN, SUM(ValTotala) AS Vinzari FROM VINZARI_CARTI GROUP BY CUBE (client, isbn) ; 9.Analiz pe trei dimensiuni i funcia CUBE poate beneficia de serviciile GROUPING-ului. Complicnd (nc) un pic exemplu, ncercm o analiz pe trei axe: judee, zile, cri (ISBN-uri). Pentru ca n list s fie puse n eviden rndurile de subtotal (cu indicarea elementelor pentru care se calculeaz subtotalul), SELECT CASE WHEN GROUPING(jud)=1 THEN CASE WHEN GROUPING(datafact)=0 AND GROUPING(isbn)=0 THEN 'subtotal zi-isbn ' ELSE CASE WHEN GROUPING(datafact)=1 AND GROUPING(isbn)=1 THEN 'TOTAL GENERAL' ELSE ' ' END END ELSE CASE WHEN GROUPING(datafact)=1 AND GROUPING(isbn)=1 THEN jud||' Total 1' ELSE jud END END AS judet, CASE WHEN GROUPING(datafact)=1 THEN CASE WHEN GROUPING(jud)=0 AND GROUPING(isbn)=0 THEN 'subtotal judet-isbn' ELSE ' ' END ELSE

CASE WHEN GROUPING(jud)=1 AND GROUPING(isbn)=1 THEN TO_CHAR(datafact,'DD-MM-YYYY')||' Total 2' ELSE TO_CHAR(datafact,'DD-MM-YYYY') END END AS Ziua, CASE WHEN GROUPING(isbn)=1 THEN CASE WHEN GROUPING(jud)=0 AND GROUPING(datafact)=0 THEN 'subtotal judet-zi ' ELSE ' ' END ELSE CASE WHEN GROUPING(jud)=1 AND GROUPING(datafact)=1 THEN isbn||' Total 3' ELSE isbn END END AS Carte, SUM(ValTotala) AS Vinzari FROM VINZARI_CARTI GROUP BY CUBE (jud, datafact, isbn) ;

Concluzii ROLLUP, CUBE, combinate cu GROUPING reprezint, probabil, cele mai spectaculoase funcii OLAP introduse n SQL99 i versiuni mai recente ale SGBD-urilor ce domin astzi piaa - DB2 6.x i 7, Oracle 8i2 i 9i etc. Bibliografie Oracle Corporation - Analytic Functions for Oracle8i, White Paper, Oct.1999 Winter, R. - SQL-99s New OLAP Functions, Intelligent Enterprise, Jan., 20, 2000 Zemke, F., Hulkarni, K., Witkowski, A., Lyle, B. - Introduction to OLAP functions, ISO/ IEC JTC1/SC32 WG3:YGJ, ANSI NCITS H2-99-154, Apr. 1999

S-ar putea să vă placă și