Ako na chybu “Operácie porovnania DAX nepodporujú porovnávanie hodnôt typu Text s hodnotami typu Integer. Zvážte skonvertovanie jednej z hodnôt pomocou funkcie VALUE alebo FORMAT”, v PowerPivote aj Power BI

V PowerPivote aj Power BI sa vám občas podarí naraziť na jednu klasickú chybovú hlášku, na ktorú občas narazí snáď každý, kto buď začína s jazykom DAX, alebo mu počas písania vzorca vypadne jeden malý detail. Tou chybovou hláškou je hláška “Operácie porovnania DAX nepodporujú porovnávanie hodnôt typu Text s hodnotami typu Integer. Zvážte skonvertovanie jednej z hodnôt pomocou funkcie VALUE alebo FORMAT”. Jej riešenie je veľmi jednoduché, keď si uvedomíte, kde je problém.

Ako to nasimulovať

Začneme znova s našim vzorovým súborom PowerPivotu, resp. Power BI. V ňom máme tabuľku Objednávky, ktorá obsahuje všetky objednávky. A v nej je okrem iného aj stĺpec CustomerKey, kde sa ku každej objednávke nachádza číslo zákazníka:

A teraz by sme chceli spraviť vypočítaný stĺpec s názvom “Typ zákazníka”, kde si zakategorizujeme zákazníkov tak, že ak je číslo zákazníka menšie ako 20000, tak spadne do kategórie “starý zákazník”, inak do kategórie “nový zákazník”. Vytvoríme teda vypočítaný stĺpec v tabuľke Objednávky, s týmto vzorcom:

Typ zákazníka = IF(‘Objednávky'[CustomerKey] < “20000”; “starý zákazník”; “nový zákazník”)

Po zadaní vzorca však dostaneme takúto chybovú hlášku:

Chybová hláška sa vo vašom prípade môže mierne líšiť, a namiesto slovíčka “Integer” tam ešte môže byť buď “Number”, alebo “Currency”, “Date”, “True/False”, a pod.. Vo všetkých prípadoch ide o ten istý problém.

Chybová hláška hovorí o tom, že porovnávame technicky neporovnateľné veci. A navrhuje skonvertovať jednu z hodnôt pomocou funkcie VALUE (skonvertuje text na číslo) alebo FORMAT (skonvertuje číslo/dátum na text). To by síce odstránilo danú hlášku, ale výsledok by asi nebol zrovna správny.

Keď sa pozriete na ten vzorec, tak problémom je to samotné porovnávanie vo funkcii IF:

Tam porovnávame stĺpec CustomerKey s hodnotou 20000. Čo je na prvý pohľad v poriadku, a tak to funguje aj vo väčšine ostatných nástrojov. Jazyk DAX je však prísnejší, a keď v ňom niečo porovnávate, tak na oboch stranách porovnania musí byť rovnaký typ údajov (alebo dátový typ). V tomto prípade je typ stĺpca CustomerKey nastavený na “Celé číslo”, a na druhej strane podmienky je textová hodnota “20000”. Čiže z technického hľadiska porovnávame číslo s textom. A to nie je podporované, pretože v jazyku DAX sa pri porovnávaní musia porovnávať hodnoty s rovnakým typom. Čiže môžete porovnávať číslo s číslom, text s textom, dátum s dátumom a pod.. Ale nie text s číslom, dátum s textom a pod.. A na vyriešenie tohto problému je teda potrebné z jednej z tých hodnôt spraviť text alebo číslo, tak aby ste porovnávali buď čísla s číslami, alebo text s textom.

A ako si zistíme typ údajov v stĺpci?

Ak ste v excelovskom PowerPivote, tak v okne PowerPivotu kliknite na stĺpec CustomerKey, a v hlavnom menu hore nájdite položku s názvom “Typ údajov”:

Ak ste v Power BI Desktope, tak najprv v ponuke napravo kliknite na stĺpec CustomerKey (zostane orámovaný žltou farbou), a potom choďte v hlavnom menu hore na záložku Modelovanie, a tam nájdite položku s názvom “Typ údajov”:

V oboch prípadoch vidíte, že typ údajov v stĺpci je nastavený na “Celé číslo”. A kliknutím na toto “tlačítko” ho viete aj zmeniť.

Ako to opraviť

Mohli by sme to skúsiť spraviť tak, že spravíme to, čo navrhuje chybová hláška – že skonvertujeme hodnotu v podmienke zo stĺpca CustomerKey na text počas porovnávania, napr. takto:

Typ zákazníka = IF(FORMAT(‘Objednávky'[CustomerKey]; “0”) < “20000”; “starý zákazník”; “nový zákazník”)

To však bude porovnávať tie 2 hodnoty ako texty, a výsledok bude úplne mimo. Pretože texty sa v počítačoch porovnávajú pomocou iných pravidiel ako čísla.

Správne riešenie je zmeniť v tej podmienke porovnania ten text “20000” na číslo tak, že odstránime tie dvojité úvodzovky:

Typ zákazníka = IF(‘Objednávky'[CustomerKey] < 20000; “starý zákazník”; “nový zákazník”)

Tým spôsobíme to, že budeme porovnávať číslo (hodnota zo stĺpca CustomerKey) s číslom (hodnota 20000). A keďže na oboch stranách porovnania sú čísla, tak to už prejde:

Opačný prípad

V niektorých prípadoch, najmä po importe dát z Excelu alebo z textových súborov, sa vám môže stať opačný prípad, ktorý vám dá rovnakú chybovú hlášku. A principiálne sa rieši podobne, ako predchádzajúci prípad. Povedzme, že používate techniku kategorizácie/bandingu z mojej knihy o Power BI. Keď si naimportujete dáta z Excelu, tak v niektorých prípadoch sa niektoré stĺpce naimportujú ako text, napriek tomu, že sú v nich iba čísla. To sa stáva kvôli tomu, že pri importe dát z Excelu v ľubovoľnej aplikácii sa excelovský ovládať snaží tipnúť si typ údajov v tom stĺpci, na základe niekoľkých prvých riadkov. Už som o tom písal v jednom staršom článku. A povedzme, že v tomto prípade sa naimportovali dáta v stĺpci CustomerKey v tabuľke Objednávky ako text:

Keď sa následne pokúsite vytvoriť nový vypočítaný stĺpec s týmto vzorcom:

Typ zákazníka = IF(‘Objednávky'[CustomerKey] < 20000; “starý zákazník”; “nový zákazník”)

…tak to spadne znova na tej istej chybovej hláške. Pretože v tomto prípade porovnávame text (hodnota zo stĺpca CustomerKey) s číslom (hodnota 20000). Opäť, môžeme najprv skúsiť spraviť to, čo navrhuje chybová hláška, a skonvertovať text na číslo pomocou funkcie VALUE:

Typ zákazníka = IF(VALUE(‘Objednávky'[CustomerKey]) < 20000; “starý zákazník”; “nový zákazník”)

A dokonca to aj zafunguje správne. Nevýhoda je však v tom, že ak by ste s tým stĺpcom takto chceli pracovať aj v iných vzorcoch, tak by ste tam zakaždým museli dávať funkciu VALUE. Čo nie je zrovna šťastné riešenie.

Lepšie riešenie je zmeniť typ údajov v tom stĺpci, resp. zmeniť dátový typ stĺpca. V tomto prípade z textu na celé číslo. Nájdite si teda to nastavenie typu údajov, tak ako je popísané vyššie. A potom naň kliknite, a zmeňte ho na “Celé číslo”:

…a prípadne potvrďte zmenu typu údajov v stĺpci, ak na vás vyskočí takéto okno:

To problém vyrieši. Teda za predpokladu, že v tom stĺpci sú naozaj všade iba čísla alebo prázdne hodnoty. Lebo potom budete v tom vzorci porovnávať celé číslo s celým číslom. A je to oveľa elegantnejšie, ako 100x používať funkciu VALUE v dátovom modeli.

Takto teda vyriešite jednu z klasických chybových hlášok, ktorá najmä začiatočníkom nedá spať. A ktorú sa občas pri nepozornosti podarí vyvolať aj ostrieľanejším užívateľom PowerPivotu a Power BI. Treba si iba dávať pozor, čítať pozorne chybové hlášky, uvedomiť si základné vlastnosti dátového modelu, a za pár sekúnd to potom zvyčajne aj vyriešite. No nie je to nádhera? 🙂