DAX ALLEXCEPT pro součet podle kategorií více dimenzionálních tabulek
Potřeboval bych vypočítat součet podle kategorií. Kategorie je v tabulce dimenzí.
Tady je ukázkový soubor: DAX ALLEXCEPT total by category.pbix
Mám následující model:
Tyto jsou mé očekávané výsledky. Celkem podle barev:
Myslel jsem si, že očekávaných výsledků dosáhnu následujícím opatřením:
ALLEXCEPT_color =CALCULATE ( , ALLEXCEPT ( FactTable, -- surprisingly 'dim1' table in that place gives wrong results dim1 ))
Nebo alternativně pomocí metody navržené Albertem Ferrarim https://www.sqlbi.com/articles/using-allexcept-versus-all-and-values/:
ALL_VALUES_color = CALCULATE ( , ALL (FactTable), -- again, 'dim1' produces wrong results, has to be FactTable VALUES ( dim1 ) )
Obě tato opatření fungují a vracejí správné výsledky. Zobrazené výsledky však násobí a vytvářejí kartézský součin všech rozměrů. Proč a jak tomu zabránit?
Očekávaných výsledků dosáhnu pomocí opatření:
Expected_Results_Color =IF ( ISBLANK ( ), BLANK (), )
Pravděpodobně mi něco chybí ve funkci ALLEXCEPT
, takže na první pokus nedostanu to, co chci. Jakou logiku má použití funkce ALLEXCEPT u více tabulek, zejména u vzdálených rozměrů, daleko od středu hvězdicového schématu.
Jaký vzor použít? Tady jsem našel slibné řešení, které vypadá takto:
ByCategories =CALCULATE ( SUM ( FactTable ), ALLEXCEPT ( dim1, dim1 ), ALLEXCEPT ( dim2, dim2 ), ALLEXCEPT ( dim3, dim3 ))
Ale jak jsem to předtím testoval, tak to nefunguje. Neagreguje to podle rozměrů, ale vytváří to tak, jak jsou.
Takže jsem zjistil, že toto je správný směr:
ByCategories =CALCULATE ( SUM ( FactTable ), ALLEXCEPT ( FactTable, -- here be difference dim1, dim2, dim3 ))
Spekuluji, že by mohl existovat i jiný způsob.
Measure = var MyTableVariable = ADDCOLUMNS ( VALUES ( dim1 ), "GroupedSales", ) RETURN ...
Jestli by šlo z MyTableVariable načíst jednu skalární hodnotu GroupedSales a přiřadit jí příslušnou barvu ve vizuálu tabulky.
Byl bych velmi vděčný za jakékoliv další postřehy při výpočtu celkového součtu pro kategorii.