Im praktischen Fall wollte ich mir aus einer Kennzahl eine Stammdateninformation extrahieren, die darin enthalten war. Die folgende Query zeigt die Struktur der Daten: neben einer Artikelnummer liegt eine Mengenangabe (QUANTITY) vor und eine zusätzliche Angabe, die ursprünglich als Menge * Packungsgröße (QUANTITY_BASEQUANTITY * QUANTITY) gebildet worden war:
select ITEMID , QUANTITY_BASEQUANTITY , QUANTITY from fact_sales where ITEMID = 334150 and rownum < 10; ITEMID QUANTITY_BASEQUANTITY QUANTITY ------- --------------------- ---------- 334150 4,8 1 334150 4,8 1 334150 9,6 2 334150 9,6 2 334150 9,6 2 334150 4,8 1 334150 9,6 2 334150 4,8 1 334150 4,8 1
Meine Vermutung war, dass die Packungsgrößen durch eine Division QUANTITY_BASEQUANTITY/QUANTITY eindeutig pro Artikel zu ermitteln wäre:
create table item_salesquantity as select distinct ITEMID , QUANTITY_BASEQUANTITY/QUANTITY Salesquantity from fact_sales; select distinct salesquantity from item_salesquantity where ITEMID = 334150; SALESQUANTITY ------------- 4,8 4,8 4,8 4,8 4,8 4,8 4,8 4,8 8 Zeilen ausgewählt.
Das kam etwas überraschend: auf den ersten Blick sehen alle Werte identisch aus, aber da DISTINCT sie unterscheidet, sind sie's offenbar nicht. Mit VSIZE lässt sich die physikalische Größe der Werte bestimmen:
select distinct salesquantity, vsize(SALESQUANTITY) from item_salesquantity where ITEMID = 334150 order by vsize(SALESQUANTITY); SALESQUANTITY VSIZE(SALESQUANTITY) ------------- -------------------- 4,8 3 4,8 10 4,8 10 4,8 11 4,8 11 4,8 21 4,8 21 4,8 21 8 Zeilen ausgewählt.
Offenbar gibt es also tatsächlich Unterschiede und diese beruhen anscheinend darauf, dass schon die zugrunde liegenden Werte bezüglich der VSIZE unterschiedlich sind:
create table item_salesquantity_noagg as select ITEMID , QUANTITY_BASEQUANTITY , QUANTITY , QUANTITY_BASEQUANTITY/QUANTITY Salesquantity from fact_sales; select distinct QUANTITY_BASEQUANTITY , vsize(QUANTITY_BASEQUANTITY) , salesquantity , vsize(SALESQUANTITY) from item_salesquantity_noagg where ITEMID = 334150 order by QUANTITY_BASEQUANTITY; QUANTITY_BASEQUANTITY VSIZE(QUANTITY_BASEQUANTITY) SALESQUANTITY VSIZE(SALESQUANTITY) --------------------- ---------------------------- ------------- -------------------- 4,8 10 4,8 10 9,6 10 4,8 10 14,4 10 4,8 21 19,2 10 4,8 11 24 2 4,8 3 28,8 10 4,8 10 33,6 10 4,8 21 38,4 10 4,8 11 43,2 10 4,8 21 48 2 4,8 3 10 Zeilen ausgewählt.
Die Moral von der Geschichte ist wohl, dass ich NUMBER-Werte weniger indifferent behandeln sollte. Als kurzfristiger Fix diente eine Rundung, die das gewünschte Resultat brachte:
create table item_salesquantity_round as select distinct ITEMID , round(QUANTITY_BASEQUANTITY/QUANTITY, 4) Salesquantity from fact_sales;
select distinct salesquantity, vsize(SALESQUANTITY) from item_salesquantity_round
where ITEMID = 334150 order by vsize(SALESQUANTITY);
SALESQUANTITY VSIZE(SALESQUANTITY) ------------- -------------------- 4,8 3