Další výpočty s časovým měřítkem

Dokončeno

Existují další funkce časového měřítka DAX, které zajišťují vrácení jediného data. Tyto funkce pochopíte, když je použijete ve dvou různých scénářích.

Funkce FIRSTDATE a LASTDATE jazyka DAX vrátí první a poslední datum v aktuálním kontextu filtru pro zadaný sloupec kalendářních dat.

Vypočet nových výskytů

Dalším použitím funkcí časového měřítka je výpočet nových výskytů. Následující příklad ukazuje, jak můžete vypočítat počet nových zákazníků za určité časové období. Nový zákazník se počítá za časové období, ve kterém realizoval první nákup.

Vaším prvním úkolem je přidat do tabulky Sales (Sales ) následující míru, která počítá počet jedinečných zákazníků od začátku životnosti (LTD). Od chvíle vzniku znamená od počátku času do posledního data v kontextu filtru. Naformátujte míru jako celé číslo s oddělovačem tisíců.

Customers LTD =
VAR CustomersLTD =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MAX('Date'[Date])
        ),
        'Sales Order'[Channel] = "Internet"
    )
RETURN
    CustomersLTD

Přidejte do maticového vizuálu míru Customers LTD (Zákazníci od chvíle vzniku). Všimněte si, že výsledek ukazuje počet jedinečných zákazníků od chvíle vzniku do konce každého měsíce.

Obrázek znázorňuje maticový vizuál se seskupením podle roku a měsíce na řádcích a s tržbami, tržbami od začátku roku (YTD), meziročním % růstu tržeb (YoY) a zákazníky od chvíle vzniku (LTD).

Funkce DATESBETWEEN vrátí tabulku obsahující sloupec kalendářních dat, který začíná daným počátečním datem a pokračuje až do daného koncového data. Když je počáteční datum prázdné, použije se první datum ve sloupci data. (Když je prázdné koncové datum, použije se poslední datum ve sloupci data.) V tomto případě je koncové datum určeno funkcí MAX, která vrací poslední datum v kontextu filtru. Pokud je tedy měsíc srpen 2017 v kontextu filtru, vrátí funkce MAX 31. srpna 2017 a DATESBETWEEN funkce vrátí všechna data až do 31. srpna 2017.

Dále upravíte míru přejmenováním na New Customers (Noví zákazníci). Potom přidáte druhou proměnnou pro uložení počtu jedinečných zákazníků před časovým obdobím v kontextu filtru. Klauzule RETURN nyní odečte tuto hodnotu od zákazníků LTD, aby získala výsledek, což je počet nových zákazníků v časovém období.

New Customers =
VAR CustomersLTD =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MAX('Date'[Date])
        ),
    'Sales Order'[Channel] = "Internet"
    )
VAR CustomersPrior =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MIN('Date'[Date]) - 1
        ),
        'Sales Order'[Channel] = "Internet"
    )
RETURN
    CustomersLTD - CustomersPrior

Obrázek znázorňuje maticový vizuál se seskupením podle roku a měsíce na řádcích a s tržbami, tržbami od začátku roku (YTD), meziročním % růstu tržeb (YoY) a novými zákazníky. Hodnoty pole New Customers (Noví zákazníci) jsou zvýrazněné.

U proměnné CustomersPrior si všimněte, že DATESBETWEEN funkce v kontextu filtru zahrnuje kalendářní data do prvního data minus jedno. Protože Microsoft Power BI interně ukládá data jako čísla, můžete přidáním nebo odečtením čísla posunout datum.

Výpočty snímků

Občas se faktická data ukládají jako snímky v čase. Mezi běžné příklady patří úrovně skladových zásob nebo zůstatky účtů. Snímek hodnot se v pravidelných intervalech načítá do tabulky.

Při tvorbě souhrnů hodnot snímků (jako jsou úrovně skladových zásob) můžete hodnoty shrnout v jakékoli dimenzi kromě data. Přidáním množství skladových zásob k různým kategoriím produktů vznikne smysluplný souhrn, ale přidáním množství skladových zásob ke kalendářním datům nikoli. Přidání včerejší úrovně skladových zásob k dnešnímu množství není vhodná operace (pokud nechcete výsledek průměrovat).

Při vytváření tabulek souhrnných snímků mohou vzorce měr vycházet z funkcí časového měřítka DAX, aby vynutily filtr s jedním datem.

V následujícím příkladu se podíváte na scénář pro společnost Adventure Works. Přepněte do zobrazení modelu a vyberte diagram modelu Inventory (Skladové zásoby).

Obrázek znázorňuje diagram modelu, který se skládá ze tří tabulek: Product (Produkt), Date (Datum) a Inventory (Skladové zásoby). Tabulka produktu a kalendářních dat má relaci 1 : N k tabulce skladových zásob.

Všimněte si, že diagram znázorňuje tři tabulky: Produkt, Datum a Inventář. V tabulce Inventory se ukládají snímky zůstatků jednotek pro každé datum a produkt. Důležité je, že tabulka neobsahuje žádná chybějící kalendářní data a žádné duplicitní položky pro žádný produkt v konkrétní datum. Poslední záznam snímku je uložen pro datum 15. června 2020.

Nyní přepněte do zobrazení sestavy a vyberte stranu 2 sestavy. Přidejte sloupec UnitsBalance tabulky Inventory do maticového vizuálu. Jeho výchozí souhrn je nastaven na součet hodnot.

Obrázek znázorňuje maticový vizuál s názvem FY2020 Mountain-200 Bike Stock. Obsahuje produkty seskupené na řádcích a měsíce seskupené ve sloupcích. Pro každý produkt a měsíc se zobrazují vysoké hodnoty.

Tato konfigurace vizuálu je ukázkou toho, jak nedělat souhrn hodnot snímku. Součet denních zůstatků snímků nepřináší smysluplný výsledek. Proto z maticového vizuálu odeberte pole UnitsBalance.

Teď přidáte do tabulky Inventory míru, která sečte hodnotu UnitsBalancepro jedno datum. Datum bude poslední datum každého časového období. Dosáhnete toho pomocí LASTDATE funkce. Naformátujte míru jako celé číslo s oddělovačem tisíců.

Stock on Hand =
CALCULATE(
    SUM(Inventory[UnitsBalance]),
    LASTDATE('Date'[Date])
)

Poznámka

Všimněte si, že vzorec míry používá SUM funkci . Je nutné použít agregační funkci (míry neumožňují přímé odkazy na sloupce), ale vzhledem k tomu, že pro každý produkt pro každé datum existuje pouze jeden řádek, SUM bude funkce fungovat pouze na jednom řádku.

Přidejte do maticového vizuálu míru Stock on Hand (Dostupné skladové zásoby). Hodnota pro každý produkt teď vychází z posledního zaznamenaného jednotkového zůstatku za každý měsíc.

Obrázek znázorňuje maticový vizuál s názvem FY2020 Mountain-200 Bike Stock. Obsahuje produkty seskupené na řádcích a měsíce seskupené ve sloupcích. Pro každý produkt a měsíc se zobrazují nižší hodnoty. June 2020 (Červen 2020) a Total (Celková hodnota) jsou prázdné.

Míra vrací prázdné hodnoty pro červen 2020, protože pro poslední datum v červnu neexistuje žádný záznam. Podle dat tento den ještě neproběhl.

Filtrování podle posledního data v kontextu filtru má své vnitřní problémy: Je možné, že zaznamenané datum neexistuje, protože ještě neproběhlo, nebo možná proto, že se o víkendech nezaznamenávají zůstatky skladových zásob.

Dalším krokem je upravit vzorec míry, aby určil poslední datum, které není prázdné, a pak podle tohoto data filtrovat. Tohoto úkolu můžete dosáhnout pomocí funkce JAZYKA LASTNONBLANK DAX.

Pomocí následující definice míry upravte míru Stock on Hand (Dostupné skladové zásoby).

Stock on Hand =
CALCULATE(
    SUM(Inventory[UnitsBalance]),
    LASTNONBLANK(
        'Date'[Date],
        CALCULATE(SUM(Inventory[UnitsBalance]))
    )
)

V maticovém vizuálu si všimněte hodnot z června 2020 a celkového součtu (představuje celý rok).

Obrázek ukazuje, že maticový vizuál teď má hodnoty pro červen 2020 a celkový součet.

Funkce LASTNONBLANK je funkce iterátoru. Vrátí poslední datum, jehož výsledek není prázdný. Funkce toho dosáhne iterací všech kalendářních dat v kontextu filtru v sestupném chronologickém pořadí. (Naopak FIRSTNONBLANK iteruje ve vzestupném chronologickém pořadí.) Pro každé datum vyhodnocuje předaný výraz. Když narazí na výsledek, který není prázdný, vrátí funkce příslušné datum. Toto datum se pak použije k filtrování CALCULATE funkce.

Poznámka

Funkce LASTNONBLANK vyhodnocuje svůj výraz v kontextu řádku. Funkce CALCULATE se musí použít k přechodu kontextu řádku na kontext filtru, aby se výraz správně vyhodnotil.

Nyní byste měli skrýt sloupec UnitsBalance v tabulce Inventory. Zabráníte tak autorům sestav v nevhodném shrnutí jednotkových zůstatků snímků.