Agregarea datelor. Operatorii CUBE si ROLLUP
Agregarea simultana a datelor dupa mai multi parametrii (dimensiuni) însotita de determinarea subtotalurilor aferente face obiectul asa-numitei analize multidimensionale. Aceasta se bazeaza pe utilizarea functiilor a 636j98g nalitice dedicate procesarii analitice on-line (On Line Analytical Processing - OLAP) si care au fost introduse în Oracle începând cu versiunea 8i a acestuia.
Exemplu : |
Se sa genereze, prin interogarea corespunzatoare a tabelei oferte_proprietati, un raport de forma urmatoare : acesta va contine valoarea medie a pretului cerut (indicatorul analizat) calculata la nivelul fiecarei combinatii zona - tip_proprietate, precum si la nivelul fiecarei zone (indiferent de tipul de proprietate) în parte, la nivelul fiecarui tip de proprietate (indiferent de zona de care apartine) în parte, precum si la nivel global. Într-o varianta clasica se propune o formulare bazata pe operatorul asamblist UNION, ce apoi este exprimata succint cu ajutorul functiei CUBE. Obs. Structura tabelei oferte_proprietati este: codinreg, tippropr, zona, str, nr, bl, sc, ap, et, pcerut, pmin, moneda, telfix, telmob, obs.
|
SELECT zona, tippropr AS Tip_Proprietate, AVG(pcerut) AS Pret_Mediu_Cerut
FROM oferte_proprietati
GROUP BY zona, tippropr
SELECT zona, '', AVG(pcerut)
FROM oferte_proprietati
GROUP BY zona
SELECT '', tippropr, AVG(pcerut)
FROM oferte_proprietati
GROUP BY tippropr
SELECT '', '', AVG(pcerut)
FROM oferte_proprietati
ORDER BY 1 ;
SELECT zona, tippropr AS Tip_Proprietate, AVG(pcerut) AS Pret_Mediu_Cerut
FROM lista_proprietati
GROUP BY CUBE (zona, tippropr) ;
Exemplu : |
Se sa genereze, prin interogarea corespunzatoare a tabelei oferte_proprietati, urmatoarele doua rapoarte
|
SELECT zona, tippropr AS Tip_Proprietate, AVG(pcerut) AS Pret_Mediu_Cerut
FROM lista_proprietati
GROUP BY ROLLUP (zona, tippropr) ;
SELECT zona, tippropr AS Tip_Proprietate, AVG(pcerut) AS Pret_Mediu_Cerut
FROM lista_proprietati
GROUP BY ROLLUP (tippropr, zona) ;
Operatori asamblisti
Acestia combina doua sau mai multe interogari, efectând operatii specifice multimilor: reuniune, intersectie, diferenta. Ei se mai numesc si operatori verticali, deoarece combinarea celor doua interogari se face câmp cu câmp (coloana cu coloana). Din acest motiv, numarul total de câmpuri si tipurile de date ale câmpurilor corespondente din cele doua interogari trebuie sa coincida.
Exemplu : |
Se va formula urmatoarea interogare : sa se utilizeze operatorul UNION pentru a concatena pozitiile celei de a doua facturi la pozitiile primei facturi sa se afiseze produsele solicitate de clientul 1001 si 1002 se va folosi operatorul INTERSECT sa se afiseze produsele din care nu s a facturat nimic |
SELECT * FROM facturi WHERE nrfact = 1
SELECT * FROM facturi WHERE nrfact = 2;
SELECT liniifact.codpr FROM liniifact, facturi
WHERE liniifact.nrfact = facturi.nrfact AND codcl = 1001
INTERSECT
SELECT liniifact.codpr FROM liniifact, facturi
WHERE liniifact.nrfact = facturi.nrfact AND codcl = 1002;
3. SELECT produse.codpr
FROM produse, liniifact
WHERE produse.codpr = liniifact.codpr (+)
MINUS
SELECT produse.codpr
FROM produse, liniifact
WHERE produse.codpr = liniifact.codpr;
Subinterogari
O subinterogare este o comanda SELECT inclusa în alta fraza SELECT. Rezultatele subinterogarii sunt transmise interogarii principale, subinterogarea putând fi utilizata în cadrul clauzelor FROM, WHERE sau HAVING ale acesteia.
Exemplu : |
Se vor formula urmatoarele interogari sa se afiseze produsul (podusele) din care s-a facturat cel mai mult sa se determine facturile emise în luna septembrie 2005; sa se afiseze atật pozitiile facturate cật si valoarea totala a acestor facturi sa se afiseze un centralizator cu facturarile produselor conform imaginii urmatoare
sa se afiseze produsele din care nu s a facturat nimic |
1. SELECT codpr, SUM (cantitate * pretunit) AS val_produs
FROM liniifact
GROUP BY codpr
HAVING SUM(cantitate * pretunit) =
(SELECT MAX(SUM(cantitate * pretunit))
FROM liniifact
GROUP BY codpr);
sau
SELECT codpr, SUM (cantitate * pretunit) AS val_produs
FROM liniifact
GROUP BY codpr
HAVING SUM (cantitate * pretunit) >= ALL
(SELECT SUM(cantitate * pretunit)
FROM liniifact
GROUP BY codpr);
sau
SELECT *
FROM (SELECT codpr, SUM(cantitate * pretunit) AS val_prod
FROM liniifact
GROUP BY codpr)
WHERE val_prod = (SELECT MAX (SUM (cantitate * pretunit))
FROM liniifact
GROUP BY codpr);
SELECT liniifact.nrfact, linie, codpr, cantitate * pretunit AS v_prod, v_fact
FROM liniifact,
(SELECT liniifact.nrfact AS fact, SUM(cantitate * pretunit) AS v_fact
FROM facturi, liniifact
WHERE facturi.nrfact = liniifact.nrfact AND
TO_CHAR(datfact,'MM/YY') = '09/05'
GROUP BY liniifact.nrfact)
WHERE liniifact.nrfact = fact;
SELECT cod1 AS produs, nrfact, valoare, total
FROM
(SELECT codpr AS cod1, nrfact, SUM(cantitate * pretunit) AS valoare
FROM liniifact
GROUP BY codpr, nrfact),
(SELECT codpr AS cod2, SUM(cantitate * pretunit) AS total
FROM liniifact
GROUP BY codpr)
WHERE cod1 = cod2;
4. SELECT codpr, denpr
FROM produse
WHERE codpr NOT IN (SELECT codpr
FROM liniifact)
|