pondělí 15. března 2010

Operace dělení nad sloupcem celočíselného datového typu

Pokud jste někdy potřebovali dělit hodnoty ve sloupci, který je v metadata repository definovaný jako datový typ INTEGER, pak zjistíte, že použití pouhého lomítka, jako operátoru pro dělení způsobí jisté nepřesnosti ve výsledku. Následujícím příkladem se pokusím celé chování demonstrovat a také nastínit možné řešení.

Z repository dostupného po nainstalování poslední verze (10.1.3.4.1) Oracle BI Enterprise Edition jsem použil dva sloupce:
Cílová oblast: Sample Sales,
Tabulka: F2 Units – 23 Dimension Total, Sloupec: 8-66 Total # or Orders (Cnt Dt for All Orders)
Tabulka: D2 Market, Sloupec: M01 Market

Zároveň pro přehlednost jsem nastavil filtr na poslední sloupec s jedinou hodnotou „Market 5“.

Výsledná tabulka po přejmenování sloupců vypadala takto:





Faktový sloupec jsem v dotazu zopakoval a nastavil pro něj hodnotu 1/100:









Výsledek byl následující:





Je vidět, že zde nedošlo ke správnému zaokrouhlení. Co s tím, pokud nemám možnost zasáhnout do repository a takovýto správně vypočítaný sloupec si připravit?
Zkusil jsem přidat ještě jednou stejný sloupec do sestavy a použít matematickou funkci pro zaokrouhlování s následným dělením stem:








Funkce ROUND si zřejmě alokuje pro svůj výpočet paměťový prostor pro datový typ, který zvládá desetinné operace (např. FLOAT nebo REAL) a proto výsledek odpovídal mému očekávání:





Petr Zeman (softwarový konzultant OKsystem)

1 komentář:

Michal Zima řekl(a)...

Na Váš "problém" existuje již poměrně dlouhou dobu jednoduchý "workaround", který vůbece nevyžaduje použití fce ROUND. Řešení je následující poměrová metrika, kde čitatel i jmenovatel jsou typu INTEGER se vytváří (interně se "přecastuje" na datovy typ s desetinnou casti) následujícím způsobem :
1.0* CITATEL/JMENOVATEL
Vynasobenim vysledku literalem 1.0 docilite interni prevod vysledku do spavneho datoveho typu. Ve vasem pripade tedy staci provest vydeleni literalem 100.0, namisto Vami pouzivaneho 100. Myslim, ze je to jednodussi a elegantnejsi nez pouziti fce ROUND.
Michal Zima
BI/DWH Architekt
Teura s.r.o.