dinsdag 17 september 2013

SUMX & IF om een outlook van een jaar te berekenen

Een tijdje geleden kwam bij mij de vraag om een outlook te berekenen van actuals en budget data.
Beide tabellen hadden periodieke data en ik besloot om van de gerealiseerde periodes de actuals te combineren met de budgetcijfers van de niet gerealiseerde periodes. Dat deed ik met behulp van de measure outlook met de functie: IF actual = 0; budget; actual.

Een prima werkte measure totdat ik de tabel liet totaliseren. Wat Powerpivot doet is simpelweg bij de totaaltelling de totalen van de actual en budget vergelijken en (aangezien de som van de actuals niet 0 is) het saldo van actuals als totaal opgeven voor de tabel outlook.

Hoe kon ik nou de juiste outlook berekenen?

Hieronder in een voorbeeld de problemen en oplossing uitgewerkt:

figuur 1a: 3 eenvoudige tabellen , actuals, budget & periode

figuur 1b: als volgt gelinkt in Powerpivot


figuur 2: ik voeg de tabel actual en budget toe aan mijn report en heb een measure  gecreĆ«erd voor de outlook. Ik noem hem  Outlook fout =if(SUM(Actual[actual])=0;sum(Budget[budget]);sum(Actual[actual]))
Je ziet hier dat periodiek juist wordt gekozen tussen actuals en budget, maar dat het eindtotaal van €70.000 niet klopt.Dat had € 255.000 moeten zijn.


 figuur3: de measure Outlook fout.


Ik heb op internet gezocht naar oplossingen, maar vond niet direct een vergelijkbaar probleem, wel een aantal aanwijzingen dat de oplossing ergens lag in een combinatie van SUMX en IF.

Na enige tijd kwam ik op de volgende measure voor een outlook:
Outlook beter = SUMX(VALUES(per[per]);IF(sum(Actual[actual])=BLANK();sum(Budget[budget]);sum(Actual[actual])))

Ik had ergens gelezen dat een SUMX icm IF, mits je de periodiek totaliseert, juist zou optellen.
Helaas klopte de totaaltelling van € 840.000   (12 x  het totaal van de actuals a € 70.000) niet met de uitkomst die ik zocht.
figuur 4


Ik besloot om twee extra measures te maken TotalActual en TotalBudget
TotalActual = sum(Actual[actual])  & TotalBudget =sum(Budget[budget]) en daarna verving ik in de outlook measure sum(Actual[actual]) voor TotalActual  & sum(Budget[budget]) voor TotalBudget het werkt!
Kennelijk moet je eerst een totaal berekenen en de uitkomst daarvan in een tweede meting te stoppen.

De measure voor de outlook wordt dan :
Outlook goed=SUMX(VALUES(per[per]);IF([TotalActual]=BLANK();[TotalBudget];[TotalActual]))

Figuur5 de oplossing met juiste outlook.


Geen opmerkingen:

Een reactie plaatsen