čtvrtek 20. května 2010

Neočekávané chování v seskupování agregovaných ukazatelů při použití sort by funkce

Mějme dimenzi nazvanou OBDOBI a k ní hierarchii H_OBDOBI. Tato hierarchie má kromě grand total úrovně ještě následující: ROK, MESIC a TYDEN.


Data ve fyzické tabulce obsahují týden jako nejjemnější údaj. Dimenze má klíč nazvaný CAS_ID a je nastavená jako časová, což ovšem, jak jsem zjistil, nehraje žádnou roli.

Sloupec Měsíc je typu VARCHAR, což způsobuje potíže se tříděním na prezentační vrstvě.
Znáte to: 1, 10, 11, 12, 2, 3,…
Z toho důvodu jsem nastavil sloupci Měsíc třídění podle klíče dimenze, u kterého vím, že je s časem rostoucí (podmínka pro časovou dimenzi). Více o alternativním třídění dat najdete zde.


Tím jsem zajistil správné třídění sloupce Měsíc.
Potíž nastala jinde, a to zcela nečekaně. Pokud jsem totiž v dotazu zobrazil sloupec měsíc a některý agregovaný ukazatel, výsledky se v jednotlivých měsících ještě seskupily (group by) podle jednotlivých týdnů:


Po chvilce bádání jsem přišel na to, že to způsobuje ono třídící pravidlo. Přidal jsem si tedy další sloupec do fyzické tabulky (PORADI_M), do kterého jsem naplnil stejné číslo pro každý záznam náležející do stejného měsíce. Tím jsem problém obešel a pro mě vyřešil.

Abych byl důsledný, nakonec jsem si celé chování odladil v NQQuery logu. Věc se má tak, že onen třídící sloupec je skutečně v každém případě posílaný do databáze v group by klauzuli. Níže je vidět část logu s sql dotazem před změnou na třídění přes M_PORADI :

select T37."ROK" as c1,
T37."MESIC" as c2,
sum(T55."PRIJEM") as c3,
T37."CAS_ID" as c4
from
"DIM_CAS$" T37,
"F_PRODEJE$" T55
where ( T37."CAS_ID" = T55."CAS_ID" )
group by T37."CAS_ID", T37."ROK", T37."MESIC"


následně podobný dotaz po změně:

select T37."ROK" as c1,
T37."MESIC" as c2,
sum(T55."VYDEJ") as c3,
T37."PORADI_M" as c4
from
"DIM_CAS$" T37,
"F_PRODEJE$" T55
where ( T37."CAS_ID" = T55."CAS_ID" )
group by T37."ROK", T37."MESIC", T37."PORADI_M"




Petr Zeman (OKsystem)

Žádné komentáře: