Funcţii OLAP

Pentru ilustrarea acestor funcţii utilizăm tabela VINZĂRI_CĂRŢI care, pentru o editură, conţine informaţii despre facturile emise - cărţile vândute librăriilor ş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 funcţie luată în discuţie este ROLLUP. Se foloseşte pentru analiza datelor pe o singură dimensiune, dar la mai multe nivele de detaliere, atunci când în rapoarte sunt necesare subtotaluri incluse în alte subtotaluri, precum şi un total general. Problema căreia vrem să-i dăm răspuns se formulează astfel: Care este totalul vânzărilor de carte, pe clienţi, localităţi şi judeţe, precum şi totalul general ? 1

' '. cât şi ecranul de răspuns sunt specifice Oracle. SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud. loc UNION SELECT jud. loc.Astfel de analize sunt cât se poate de frecvente şi necesare pentru toate tipurile de firme. ' '. 2 . Plasarea normală (la sfârşitul grupului) necesită utilizarea unui caracter cu un cod ASCII suficient de mare pentru ca linia respectivă să fie ultima din grup SELECT jud. loc. De obicei. 4. client. ' Subtotal JUDET '||jud. loc. SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti . SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud. respectiv pe ultima linie a rezultatului. loc UNION SELECT jud. În lipsa unui operator de genul ROLLUP. Atât interogarea. CHR(123)||' Subtotal LOCALITATE ' ||loc. loc. soluţia necesită reuniunea (UNION) SELECT jud. SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud. ' '. client. dar formularea acesteia în DB2 nu ridică dificultăţi deosebite. client UNION SELECT jud. client UNION SELECT jud. în timp ce interogarea precedentă plasează subtotalul la început. subtotalurile şi totalul general sunt afişate după fiecare grup. ' Subtotal LOCALITATE ' ||loc. loc. CHR(123)||' Subtotal JUDET '||jud. 'TOTAL GENERAL '. SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud. SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud UNION SELECT ' '. loc.

loc. SUM(ValTotala) AS Val_Vinzari. loc. client. În total sunt 3 + 1 = 4 nivele de (sub)totalizare. GROUPING (Loc) AS Grup_Loc. Combinarea funcţiilor ROLLUP şi GROUPING SELECT jud. 'TOTAL GENERAL '. pentru Jud şi. 6. în final. 7. apoi câte un subtotal pentru Loc. vor exista patru variante de grupare a datelor: • grupare după client şi produs. Cu operatorul ROLLUP asemenea operaţiuni devin grozav de lesnicioase SELECT jud. SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti . 5. client) . produse şi clienţi. cea geografică. Client. totuşi. • grupare numai după client. Loc. client . în exemplele de până acum. totalul general. 3 . Dacă singura axă de (subtotalizare) a fost. loc. ' '. 3 pentru cele trei atribute plus totalul general. loc. una multi-dimensională. CUBE O analiză care se respectă este. SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY ROLLUP(jud. GROUPING (Jud) AS Grup_Jud. Se calculează valoarea funcţiei SUM pentru atributul cel mai din dreapta al ROLLUP-ului Client (acesta se consideră a fi primul subtotal). GROUPING (Client) AS Grup_Client FROM vinzari_carti GROUP BY ROLLUP(jud. client) ORDER BY jud. în continuare ne interesează să vizualizăm vânzările pe două axe. Întrucât produse şi clienţi sunt două variabile independente.SUM(ValTotala) AS Val_Vinzari FROM vinzari_carti GROUP BY jud UNION SELECT CHR(123)||' '.

Pentru ca în listă să fie puse în evidenţă rândurile de subtotal (cu indicarea elementelor pentru care se calculează subtotalul). încercăm o analiză pe trei axe: judeţe. O soluţie bazată pe CUBE este cât se poate de simplă şi directă. SUM(ValTotala) AS Vinzari FROM VINZARI_CARTI GROUP BY CUBE (client. ISBN.• grupare numai după produs şi • un grup de total general. cărţi (ISBN-uri). CASE WHEN GROUPING(datafact)=1 THEN CASE WHEN GROUPING(jud)=0 AND GROUPING(isbn)=0 THEN 'subtotal judet-isbn' ELSE ' ' END ELSE 4 . Complicând (încă) un pic exemplu.Analiză pe trei dimensiuni Şi funcţia CUBE poate beneficia de serviciile GROUPING-ului. SELECT client. isbn) . 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. 9. zile.

Concluzii ROLLUP. Apr.1999 Winter. isbn) . datafact. Witkowski. ISO/ IEC JTC1/SC32 WG3:YGJ. Hulkarni.Analytic Functions for Oracle8i. .'DD-MM-YYYY')||' – Total 2' ELSE TO_CHAR(datafact. 2000 Zemke. 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. . Oct.DB2 6. A.. Intelligent Enterprise. White Paper. 1999 5 .'DD-MM-YYYY') END END AS Ziua. F. CUBE.x şi 7. Lyle. Oracle 8i2 şi 9i etc.. 20.CASE WHEN GROUPING(jud)=1 AND GROUPING(isbn)=1 THEN TO_CHAR(datafact.. probabil.. K. SUM(ValTotala) AS Vinzari FROM VINZARI_CARTI GROUP BY CUBE (jud. Jan. ANSI NCITS H2-99-154. Bibliografie Oracle Corporation . combinate cu GROUPING reprezintă.Introduction to OLAP functions. B. R.SQL-99´s New OLAP Functions. cele mai spectaculoase funcţii OLAP introduse în SQL99 şi versiuni mai recente ale SGBD-urilor ce domină astăzi piaţa .

Sign up to vote on this title
UsefulNot useful