Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Komunikaty błędów DAX

DAX oczekuje tabeli, a dostaje wartość - błąd w FILTER, SUMX i CALCULATETABLE

W skrócie

  • Komunikat „Funkcja SUMX oczekuje wyrażenia tabeli dla argumentu 1” oznacza, że funkcja przyjmująca tabelę, taka jak SUMX, FILTER, COUNTROWS albo CALCULATETABLE, dostała w tym miejscu miarę, liczbę albo zmienną z jedną wartością.
  • Kolumna wpisana w miejsce tabeli daje inny komunikat, o pojedynczej wartości kolumny, bo silnik traktuje goły zapis kolumny jako odwołanie do wartości, a nie jako listę wartości.
  • Listę wartości kolumny podaj przez VALUES albo ALL, warunek przez FILTER, a liczbę licz przez CALCULATE zamiast CALCULATETABLE.

Komunikat, że DAX oczekuje wyrażenia tabeli, dostaje autor miary, który do iteratora albo do FILTER przekazał miarę, liczbę lub kolumnę zamiast tabeli. Pokazujemy, jak przeczytać numer argumentu w komunikacie, czym ten błąd różni się od błędu kolumny bez agregacji i jak przepisać formułę, żeby funkcja dostała tabelę, której potrzebuje.

Jak to wygląda w praktyce

Power BI pokazuje komunikat z nazwą funkcji i numerem argumentu. Na modelu Nordvelli miara SUMX([Łączna sprzedaż], 1) zgłosiła: „Funkcja SUMX oczekuje wyrażenia tabeli dla argumentu 1, ale zostało użyte wyrażenie ciągu lub liczbowe.” (w angielskiej wersji: „The SUMX function expects a table expression for argument '1', but a string or numeric expression was used.”). Ten sam wzór dostały COUNTROWS([Łączna sprzedaż]), FILTER(15, TRUE()) i CALCULATETABLE(SUM(FaktSprzedaz[WartoscNetto]), DimSklepy[Typ] = "E-commerce"), każdy z nazwą swojej funkcji.

Gdy w miejscu tabeli jest zmienna z liczbą, numer argumentu znika: VAR s = SUM(FaktSprzedaz[WartoscNetto]) RETURN COUNTROWS(s) daje „Funkcja COUNTROWS oczekuje wyrażenia tabeli dla argumentu , ale zostało użyte wyrażenie ciągu lub liczbowe.” W zapytaniu DAX, na przykład w widoku zapytań w języku DAX, ten sam problem ma inną postać: EVALUATE [Łączna sprzedaż] kończy się komunikatem „Wyrażenie określone w zapytaniu nie jest prawidłowym wyrażeniem tabeli.” (w angielskiej wersji: „The expression specified in the query is not a valid table expression.”).

Dlaczego tak się dzieje

DAX rozróżnia wyrażenia zwracające tabelę i wyrażenia zwracające jedną wartość, czyli wartość skalarną. Pierwszy argument SUMX, FILTER i COUNTROWS ma być tabelą: według dokumentacji Microsoft może to być tabela modelu albo wyrażenie, które zwraca tabelę. Miara zawsze zwraca jedną wartość, więc nie da się po niej iterować. CALCULATETABLE liczy w zmienionym kontekście wyrażenie tabelowe, a do wyrażenia z jedną wartością służy CALCULATE.

Kolumna wpisana wprost w miejsce tabeli daje inny komunikat. COUNTROWS(DimSklepy[Miasto]), FILTER(DimSklepy[Miasto], [Łączna sprzedaż] > 30000000) i SUMX(FaktSprzedaz[WartoscNetto], FaktSprzedaz[WartoscNetto] * 1.23) zgłosiły na modelu Nordvelli komunikat zaczynający się od słów „Nie można określić pojedynczej wartości dla kolumny „Miasto” w tabeli „DimSklepy”.” (przy SUMX z kolumną „WartoscNetto” w tabeli „FaktSprzedaz”), czyli błąd kolumny bez agregacji, który opisujemy w poście nie można określić pojedynczej wartości dla kolumny. Silnik traktuje goły zapis kolumny jako odwołanie do wartości z bieżącego wiersza, a nie jako listę wartości. Listę daje dopiero funkcja tabelowa, na przykład VALUES.

Co zrobić krok po kroku

  1. Przeczytaj nazwę funkcji i numer argumentu w komunikacie. Argument 1 to pierwszy element w nawiasie, więc w SUMX([Łączna sprzedaż], 1) problemem jest miara na pierwszym miejscu. Pusty numer argumentu dostaliśmy wtedy, gdy do funkcji tabelowej trafiła zmienna VAR z liczbą, więc szukaj takiej zmiennej.
  2. Gdy chcesz policzyć miarę dla każdej wartości kolumny i zsumować wyniki, podaj iteratorowi listę wartości przez VALUES. Na modelu Nordvelli suma sprzedaży po 11 miastach to 467 775 009,17 zł, tyle samo co miara [Łączna sprzedaż]. Ten sam wzorzec służy do średniej albo maksimum z miast.
    Sprzedaż po miastach = SUMX(VALUES(DimSklepy[Miasto]), [Łączna sprzedaż])
  3. Gdy FILTER ma przejść po wartościach kolumny, też podaj VALUES. Miara poniżej zostawia miasta, w których sprzedaż przekracza 30 mln zł. Na modelu Nordvelli są to 4 z 11 miast (Warszawa, Kraków, Katowice i Wrocław), razem 336 409 879,30 zł.
    Sprzedaż miast powyżej 30 mln =
    CALCULATE(
        [Łączna sprzedaż],
        FILTER(VALUES(DimSklepy[Miasto]), [Łączna sprzedaż] > 30000000)
    )
  4. Wybierz między VALUES a ALL świadomie. VALUES zwraca wartości widoczne w bieżącym kontekście, a ALL wszystkie wartości kolumny bez filtrów. Przy filtrze na region Zachód COUNTROWS(VALUES(DimSklepy[Miasto])) daje 3, a COUNTROWS(ALL(DimSklepy[Miasto])) daje 11.
  5. Gdy wynik ma być liczbą, zamień CALCULATETABLE na CALCULATE: pierwsza formuła poniżej daje 32 737 transakcji sklepu internetowego. CALCULATETABLE zostaw tam, gdzie potrzebujesz tabeli w zmienionym kontekście, na przykład listy miast ze sklepami typu Flagship. Drugą formułę wpisz po kliknięciu Nowa tabela na karcie Modelowanie, bo zwraca tabelę, a nie liczbę. Na modelu Nordvelli są w niej Warszawa, Kraków, Wrocław, Gdańsk i Katowice.
    Liczba transakcji online =
    CALCULATE(COUNTROWS(FaktSprzedaz), DimSklepy[Typ] = "E-commerce")
    
    Miasta flagowe =
    CALCULATETABLE(VALUES(DimSklepy[Miasto]), DimSklepy[Typ] = "Flagship")
  6. Gdy FILTER ma zwrócić wiersze dla iteratora, podaj go jako pierwszy argument SUMX. Sprzedaż telefoniczna Nordvelli z 5474 transakcji to 23 350 054,83 zł. Ten sam wynik daje prostszy zapis z CALCULATE i warunkiem na kolumnie, który według dokumentacji Microsoft silnik filtruje wydajniej, o czym piszemy w poście o wolnej mierze z FILTER na całej tabeli.
    Sprzedaż telefoniczna =
    SUMX(
        FILTER(FaktSprzedaz, FaktSprzedaz[KanalSprzedazy] = "Telefon"),
        FaktSprzedaz[WartoscNetto]
    )
  7. W zapytaniu DAX opakuj pojedynczą wartość w konstruktor tabeli z nawiasami klamrowymi albo w funkcję ROW: EVALUATE { [Łączna sprzedaż] } zwraca jedną kolumnę z wartością 467 775 009,17 zł.

Jak sprawdzić, że problem zniknął

Po poprawce komunikat znika, a miara zwraca liczbę. Sprawdź ją na znanej wartości: dla miary sumującej, takiej jak sprzedaż, suma po miastach przez SUMX i VALUES musi być równa mierze [Łączna sprzedaż], na modelu Nordvelli 467 775 009,17 zł. Gdy obie liczby się różnią, sprawdź, po jakiej liście wartości przechodzi iterator.

Przy każdej funkcji DAX sprawdzaj w dokumentacji, czy argument ma być tabelą, czy wartością. Odwrotną sytuację, czyli tabelę wielu wartości podaną tam, gdzie potrzebna jest jedna, opisujemy w poście tabela wielu wartości tam, gdzie potrzebna jedna.

Źródła i sposób sprawdzenia

  • Microsoft Learn: FILTER function (DAX) (źródło)
  • Microsoft Learn: CALCULATETABLE function (DAX) (źródło)
  • Microsoft Learn: VALUES function (DAX) (źródło)
  • Microsoft Learn: Avoid using FILTER as a filter argument (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: miara, liczba, zmienna i kolumna w miejscu tabeli oraz poprawki z VALUES, ALL, FILTER, CALCULATE i konstruktorem tabeli.

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 oznacza błąd funkcja oczekuje wyrażenia tabeli w DAX?
Funkcja, która przyjmuje tabelę, na przykład SUMX, FILTER, COUNTROWS albo CALCULATETABLE, dostała w tym argumencie miarę, liczbę albo zmienną z jedną wartością. Numer w komunikacie wskazuje, który argument jest zły. Rozwiązaniem jest podanie tabeli, na przykład VALUES z kolumną, albo zamiana funkcji na wersję dla jednej wartości.
Czy w FILTER można podać samą kolumnę?
Nie wprost. Zapis FILTER(DimSklepy[Miasto], warunek) na modelu Nordvelli zgłosił błąd pojedynczej wartości kolumny. Kolumnę trzeba podać przez funkcję tabelową, na przykład VALUES dla wartości widocznych w kontekście albo ALL dla wszystkich wartości kolumny.
Czym różni się CALCULATE od CALCULATETABLE?
Obie funkcje liczą wyrażenie w zmienionym kontekście filtra, ale CALCULATE zwraca jedną wartość, a CALCULATETABLE tabelę. CALCULATETABLE z sumą w pierwszym argumencie zgłasza błąd, że funkcja oczekuje wyrażenia tabeli. Do liczby w mierze używaj CALCULATE.
Jak w zapytaniu DAX wyświetlić wartość miary?
EVALUATE wymaga tabeli, więc samą miarę trzeba opakować, na przykład w nawiasy klamrowe jako EVALUATE { [Łączna sprzedaż] } albo w funkcję ROW. Zapis EVALUATE [Łączna sprzedaż] kończy się komunikatem, że wyrażenie określone w zapytaniu nie jest prawidłowym wyrażeniem tabeli.

Komentarze (0)

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

Brak komentarzy...