Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Komunikaty błędów DAX

Tabela wielu wartości tam, gdzie potrzebna jedna - błąd wartości skalarnej w DAX

W skrócie

  • Komunikat „Została dostarczona tabela wielu wartości, podczas gdy oczekiwano pojedynczej wartości” oznacza, że wyrażenie DAX zwróciło tabelę z kilkoma wierszami, na przykład VALUES z kilkoma miastami, tam, gdzie potrzebna jest jedna wartość skalarna.
  • Błąd zależy od kontekstu: ta sama miara działa w wierszu jednego sklepu, a zgłasza błąd w sumie i w regionie z kilkoma miastami. Dlatego wychodzi dopiero po dodaniu sumy albo zmianie fragmentatora.
  • Zamiast VALUES użyj SELECTEDVALUE z wartością zastępczą, HASONEVALUE, CONCATENATEX dla listy albo operatora IN do sprawdzenia, czy wartość jest na liście.

Komunikat o tabeli wielu wartości podanej tam, gdzie DAX oczekuje jednej wartości skalarnej, zaskakuje, bo ta sama miara w części wizualizacji działa poprawnie. Pokazujemy, w jakim kontekście pojawia się ten błąd, które funkcje poza VALUES go wywołują i jak przepisać miarę, żeby działała w każdym wierszu i w sumie.

Jak to wygląda w praktyce

Na modelu Nordvelli miara z miastem sklepu, potrzebna na przykład do tytułu wizualizacji, wygląda tak:

Miasto sklepu = VALUES(DimSklepy[Miasto])

W wierszach poszczególnych sklepów działa: każdy z 15 sklepów dostaje swoje miasto. W karcie bez filtra, w wierszu sumy i w tabeli po regionach ta sama miara zgłasza: „Została dostarczona tabela wielu wartości, podczas gdy oczekiwano pojedynczej wartości.” (w angielskiej wersji: „A table of multiple values was supplied where a single value was expected.”). W zapytaniu DAX silnik dodaje przed tym tekstem nazwę miary: „Błąd obliczania w mierze „FaktSprzedaz”[Miasto sklepu]:” (w angielskiej wersji: „Calculation error in measure 'FaktSprzedaz'[Miasto sklepu]:”).

Ten sam komunikat dały porównanie IF(VALUES(DimSklepy[Typ]) = "Flagship", [Łączna sprzedaż], 0) w tabeli po regionach, LOOKUPVALUE(DimSklepy[Miasto], DimSklepy[Typ], "Flagship"), bo sklepy typu Flagship są w pięciu miastach, i kolumna obliczeniowa Kanał sprzedaży = CALCULATE(VALUES(FaktSprzedaz[KanalSprzedazy])) w tabeli DimSklepy, bo każdy sklep stacjonarny sprzedaje w dwóch kanałach.

Dlaczego tak się dzieje

VALUES zwraca tabelę wartości widocznych w bieżącym kontekście filtra. Gdy ta tabela ma jeden wiersz i jedną kolumnę, DAX może użyć jej jak pojedynczej wartości, dlatego miara działa w wierszu jednego sklepu. Gdy wierszy jest więcej, nie ma jednej wartości do zwrócenia. W regionie Centrum są dwa miasta, Łódź i Warszawa, a w sumie wszystkie 11, więc tam miara przestaje działać.

To odwrotność błędu z posta nie można określić pojedynczej wartości dla kolumny. Tamten wynika z zapisu formuły i pojawia się zawsze, ten zależy od danych w kontekście, więc wychodzi dopiero wtedy, gdy ktoś doda wiersz sumy, zmieni poziom wizualizacji albo zaznaczy dwa elementy we fragmentatorze. Według dokumentacji Microsoft porównanie tabeli z wieloma wierszami z pojedynczą wartością kończy się błędem i dlatego zalecana jest funkcja SELECTEDVALUE. LOOKUPVALUE z kolei zgłasza błąd, gdy pasujące wiersze mają różne wartości wyniku.

Co zrobić krok po kroku

  1. Gdy potrzebujesz jednej wartości do wyświetlenia, zamień VALUES na SELECTEDVALUE z wartością zastępczą w drugim argumencie. Na modelu Nordvelli miara poniżej pokazuje „Kilka miast” w pięciu regionach ze sklepami stacjonarnymi i „Warszawa” w regionie Online, a w sumie zamiast błędu zwraca wartość zastępczą.
    Miasto sklepu = SELECTEDVALUE(DimSklepy[Miasto], "Kilka miast")
  2. Gdy dla jednej wartości ma się liczyć coś innego niż dla wielu, użyj HASONEVALUE. Ta funkcja sprawdza liczbę różnych wartości, a nie liczbę wierszy: przy filtrze na Kraków, gdzie są dwa sklepy, miara zwraca „Kraków”, a w sumie „Wiele miast”. Według dokumentacji Microsoft taki zapis z IF, HASONEVALUE i VALUES jest odpowiednikiem SELECTEDVALUE z wartością zastępczą.
    Miasto sklepu =
    IF(
        HASONEVALUE(DimSklepy[Miasto]),
        VALUES(DimSklepy[Miasto]),
        "Wiele miast"
    )
  3. Gdy chcesz pokazać wszystkie wartości, złącz je w tekst funkcją CONCATENATEX. W tabeli po regionach dostajesz na przykład „Łódź, Warszawa” dla regionu Centrum i „Poznań, Szczecin, Wrocław” dla regionu Zachód.
    Miasta regionu =
    CONCATENATEX(VALUES(DimSklepy[Miasto]), DimSklepy[Miasto], ", ", DimSklepy[Miasto], ASC)
  4. Gdy sprawdzasz, czy wartość występuje w kontekście, zamiast porównania z VALUES użyj operatora IN. Miara poniżej odpowiada „tak” w regionach Centrum, Południe, Zachód i Północ, a „nie” w regionach Wschód i Online, bez względu na to, ile typów sklepów jest w regionie.
    Czy region ma sklep flagowy =
    IF("Flagship" IN VALUES(DimSklepy[Typ]), "tak", "nie")
  5. W LOOKUPVALUE podaj czwarty argument, czyli wynik zastępczy. Według dokumentacji Microsoft funkcja zwraca go, gdy pasujące wiersze mają różne wartości. LOOKUPVALUE(DimSklepy[Miasto], DimSklepy[Typ], "Flagship", "kilka miast") zwraca „kilka miast”, a dla typu E-commerce, który ma jeden sklep, ta sama funkcja bez czwartego argumentu zwraca „Warszawa”.
  6. W kolumnie obliczeniowej, która ma zebrać kilka wartości z tabeli faktów, złącz je funkcją CONCATENATEX albo je policz. Dla Nordvella Warszawa Centrum pierwsza kolumna daje „Stacjonarne, Telefon”, dla Nordvella Online „Online”, a druga kolumna daje 2 kanały dla każdego z trzech warszawskich sklepów stacjonarnych.
    Kanały sprzedaży =
    CONCATENATEX(
        CALCULATETABLE(VALUES(FaktSprzedaz[KanalSprzedazy])),
        FaktSprzedaz[KanalSprzedazy], ", ", FaktSprzedaz[KanalSprzedazy], ASC
    )
    
    Liczba kanałów = CALCULATE(DISTINCTCOUNT(FaktSprzedaz[KanalSprzedazy]))

Jak sprawdzić, że problem zniknął

Sprawdź miarę na trzech poziomach: w wierszu jednego sklepu, w grupie z kilkoma wartościami i w sumie. Na modelu Nordvelli miara Tytuł szczegółów z lekcji o przechodzeniu do szczegółów, zbudowana na SELECTEDVALUE, zwraca „Nordvella Kraków Galeria (Kraków)” dla jednego sklepu i „Wszystkie sklepy” bez filtra. Przy filtrze na Kraków, gdzie są dwa sklepy, też zwraca „Wszystkie sklepy”, bo SELECTEDVALUE dla dwóch nazw daje pustą wartość. Taki tekst jest poprawny technicznie, ale może wprowadzić odbiorcę w błąd, o czym piszemy w poście SELECTEDVALUE zwraca pustą wartość przy kilku zaznaczeniach.

Żeby błąd nie wracał, w miarach nie zwracaj VALUES bez zabezpieczenia i nie porównuj go z tekstem ani liczbą. Gdy wizualizacja mimo poprawek pokazuje błąd zamiast danych, szczegóły komunikatu odczytasz tak, jak opisujemy w poście nie można wyświetlić elementu wizualnego.

Formuła miary Tytuł szczegółów z SELECTEDVALUE i ISBLANK w pasku formuły Power BI, tabela główna DimSklepy
Miara Tytuł szczegółów przed zatwierdzeniem: dwie zmienne z SELECTEDVALUE dla nazwy sklepu i miasta oraz IF z ISBLANK. Pole Tabela główna na wstążce pokazuje DimSklepy.

Źródła i sposób sprawdzenia

  • Microsoft Learn: Use SELECTEDVALUE instead of VALUES in DAX (źródło)
  • Microsoft Learn: SELECTEDVALUE function (DAX) (źródło)
  • Microsoft Learn: LOOKUPVALUE function (DAX) (źródło)
  • Microsoft Learn: CONCATENATEX function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: VALUES w mierze na poziomie sklepu, regionu i sumy, porównanie z VALUES, LOOKUPVALUE, kolumna obliczeniowa i poprawki.

Zachowanie programu sprawdziliśmy w Power BI Desktop 2.157 (wydanie z sierpnia 2026 r.) z polskim interfejsem, a przykłady na modelu sieci Nordvella z bezpłatnego kursu Power BI. Microsoft wydaje nową wersję Power BI Desktop co miesiąc, więc nazwy przycisków i limity usługi mogą się zmieniać. Aktualne wartości podaje dokumentacja Microsoft Learn.

Wróć do listy: 131 najczęstszych pytań i problemów związanych z Power BI

Najczęściej zadawane pytania

Co znaczy błąd została dostarczona tabela wielu wartości?
Wyrażenie DAX zwróciło tabelę z kilkoma wierszami tam, gdzie potrzebna jest jedna wartość, na przykład VALUES z kilkoma miastami w mierze albo w porównaniu. Błąd zależy od kontekstu, więc ta sama miara może działać w wierszu jednego sklepu i zgłaszać błąd w sumie. Rozwiązaniem jest SELECTEDVALUE, HASONEVALUE albo CONCATENATEX.
Dlaczego miara z VALUES działa w wierszach tabeli, a w karcie zgłasza błąd?
W wierszu jednego sklepu VALUES zwraca jedną wartość i DAX może jej użyć jak liczby albo tekstu. Karta bez filtra i wiersz sumy widzą wszystkie wartości kolumny, na modelu Nordvelli 11 miast, więc jednej wartości nie ma. SELECTEDVALUE z wartością zastępczą działa w obu miejscach.
Czym różni się SELECTEDVALUE od VALUES?
VALUES zwraca tabelę wszystkich widocznych wartości kolumny. SELECTEDVALUE zwraca jedną wartość, gdy w kontekście jest dokładnie jedna, a w przeciwnym razie wartość zastępczą albo pustą. Według dokumentacji Microsoft SELECTEDVALUE jest odpowiednikiem IF z HASONEVALUE i VALUES.
Jak w DAX sprawdzić, czy wartość jest wśród widocznych wartości kolumny?
Użyj operatora IN z VALUES, na przykład „Flagship” IN VALUES(DimSklepy[Typ]). Taki warunek działa niezależnie od liczby widocznych wartości, a porównanie VALUES(DimSklepy[Typ]) = „Flagship” przy kilku typach sklepów zgłasza błąd tabeli wielu wartości.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...