středa 30. dubna 2008

Počet záznamů u kombinovaných dotazů (číslování řádků u složených dotazů)

Nejprve si vytvoříme kombinovaný dotaz. První část vypadá asi takto:


s výsledkem:


První část dotazu je výpis všech produktů, které v roce 2006 dosáhly počtu 5mil. a více. Sloupec RCOUNT(1) obsahuje funkci průběžné agregace RCOUNT (exp) s hodnotou parametru 1 - tj. takto použitá funkce vrací pořadí záznamu v tabulce.

Nyní vytvoříme další – podobný – dotaz. Ten bude obsahovat obdobný výpis produktů splňujících danou podmínku – ovšem v roce 2007. (Poznámka: Zjistit počet takovýchto produktů za dva roky je přirozeně jednodušší zadáním podmínky, kde rok je v intervalu 2006 a 2007. Ale pak by nešlo demonstrovat počet záznamů u kombinovaných dotazů ).


Výsledkem je tabulka jejíž řádky jsou očíslovány samostatně pro každý rok.


Nyní použijeme záložku "Pokročilé" a provedeme editaci SQL zobrazení

Originál:
SELECT saw_0, saw_1, saw_2, saw_3 FROM ((SELECT "Čas".Rok saw_0, Produkty."Název produktu" saw_1, Fakta."Počet" saw_2, RCOUNT(1) saw_3 FROM Ukazka WHERE ("Čas".Rok = '2006') AND (Fakta."Počet" >= 5000000)) UNION (SELECT "Čas".Rok saw_0, Produkty."Název produktu" saw_1, Fakta."Počet" saw_2, RCOUNT(1) saw_3 FROM Ukazka WHERE (Fakta."Počet" >= 5000000) AND ("Čas".Rok = '2007'))) t1 ORDER BY saw_0, saw_1

Změna:
SELECT saw_0, saw_1, saw_2, RCOUNT(1) FROM ((SELECT "Čas".Rok saw_0, Produkty."Název produktu" saw_1, Fakta."Počet" saw_2, RCOUNT(1) saw_3 FROM Ukazka WHERE ("Čas".Rok = '2006') AND (Fakta."Počet" >= 5000000)) UNION (SELECT "Čas".Rok saw_0, Produkty."Název produktu" saw_1, Fakta."Počet" saw_2, RCOUNT(1) saw_3 FROM Ukazka WHERE (Fakta."Počet" >= 5000000) AND ("Čas".Rok = '2007'))) t1 ORDER BY saw_0, saw_1

Jinými slovy ve složeném SELECTu sloupec saw_3 nahradíme funkcí RCOUNT(1). Výsledkem je správné očíslování řádků u složeného dotazu.


Poznámka:
Stejného efektu mohlo být dosaženo i tak, když by ve 4. sloupci (tj. saw_3) kombinovaných dotazů byla použita libovolná konstanta. Pak by ale nebylo vidět dvojí číslování řádků před konečnou úpravou.


Příspěvek vytvořil a zaslal Jiří Doubravský - BI/DW konzultant společnosti PIKE Electronic. Díky! (Požadavek pro řešení této úlohy vznikl na 1. Oracle Czech BI/DW Experts Bootcampu).

Žádné komentáře: