Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - DAX liczy, ale nie to, czego oczekujesz

SELECTEDVALUE zwraca pustą wartość - kilka zaznaczeń we fragmentatorze

W skrócie

  • SELECTEDVALUE zwraca puste pole albo wartość z drugiego argumentu, gdy we fragmentatorze zaznaczono kilka pozycji, gdy nie zaznaczono żadnej i w wierszu Suma tabeli.
  • Funkcja patrzy na liczbę odrębnych wartości kolumny w kontekście, a nie na liczbę kliknięć. Dwa sklepy z Warszawy dają jedno miasto, a jedno miasto z dwoma sklepami daje pustą nazwę sklepu.
  • Gdy obliczenie potrzebuje jednej wartości, ustaw fragmentator na wybór pojedynczy albo pokaż komunikat z HASONEVALUE i ISFILTERED. Tytuł dla kilku zaznaczeń zbuduj z CONCATENATEX.

Odbiorca zaznacza we fragmentatorze rabat 10 procent, z klawiszem Ctrl dokłada 12 procent, a sprzedaż po rabacie wraca do 467 775 009,17 zł, czyli kwoty bez żadnego rabatu. Przy dwóch zaznaczeniach SELECTEDVALUE nie ma jednej wartości do zwrócenia, więc miara po cichu wraca do wartości domyślnej i liczy coś innego, niż widzi odbiorca. Tak samo psuje się nazwa sklepu w tytule i miasto w podpisie karty. Pokazujemy, kiedy SELECTEDVALUE zwraca puste, jak to sprawdzić i jakie miary napisać zamiast niej. Wyniki pochodzą z zapytań na modelu Nordvelli.

Jak to wygląda w praktyce

Najgroźniejszy przypadek to parametr. Miara Rabat proc wartość z kursu ma postać SELECTEDVALUE('Rabat proc'[Rabat proc], 0). Gdy fragmentator parametru ma styl Rozwijanie, tak jak w kursie przy parametrze Zmiana ceny, odbiorca może z klawiszem Ctrl zaznaczyć kilka wartości, bo według dokumentacji Microsoft wybór pojedynczy jest domyślnie wyłączony. Przy rabacie 10 miara Sprzedaż po rabacie pokazuje 420 997 508,25 zł, przy 12 pokazuje 411 642 008,07 zł. Gdy zaznaczysz naraz 10 i 12, rabat spada do domyślnego 0, a sprzedaż po rabacie wynosi 467 775 009,17 zł, czyli tyle, ile sprzedaż bez żadnego rabatu. Żaden komunikat o tym nie informuje.

Drugi objaw to tytuł. Miara Tytuł szczegółów z lekcji o stronach Drąż wskroś odczytuje SELECTEDVALUE(DimSklepy[Nazwa]) i przy pustym wyniku pisze „Wszystkie sklepy”. Dla jednego sklepu daje „Nordvella Gdańsk (Gdańsk)”, ale położona na stronie z fragmentatorem miast przy zaznaczonych Krakowie i Gdańsku też pisze „Wszystkie sklepy”, choć karta obok pokazuje 78 334 427,94 zł zamiast 467 775 009,17 zł całej sieci. Tak samo jest przy samym Krakowie (50 479 566,75 zł), bo Kraków ma dwa sklepy. Trzeci objaw widać w tabeli z wierszami po mieście: miara z SELECTEDVALUE pokazuje nazwę miasta w każdym wierszu, a w wierszu Suma puste pole.

Pasek formuły Power BI z miarą Rabat proc wartość = SELECTEDVALUE('Rabat proc'[Rabat proc], 0)
Miara Rabat proc wartość z kursu odczytuje wybór z fragmentatora przez SELECTEDVALUE z wartością domyślną 0.

Dlaczego tak się dzieje

Według dokumentacji Microsoft SELECTEDVALUE zwraca wartość tylko wtedy, gdy kontekst ogranicza kolumnę do jednej odrębnej wartości, a w każdym innym przypadku zwraca drugi argument, domyślnie pustą wartość. Dokumentacja podaje też odpowiednik: IF(HASONEVALUE(kolumna), VALUES(kolumna), wartość domyślna). Kontekst filtra, czyli zestaw warunków z fragmentatorów, wierszy tabeli i filtrów strony, przy dwóch zaznaczeniach zostawia w kolumnie dwie wartości, przy braku zaznaczeń wszystkie, a w wierszu Suma kolumna nie jest filtrowana wcale. Na Nordvelli bez filtra jest 11 miast i 15 sklepów.

Liczy się liczba odrębnych wartości kolumny, a nie liczba kliknięć. Zaznaczenie dwóch sklepów, Nordvella Warszawa Centrum i Nordvella Warszawa Mokotów, zostawia jedno miasto, więc SELECTEDVALUE(DimSklepy[Miasto]) zwraca „Warszawa”, choć sam filtr dotyczy kolumny Nazwa, a ISFILTERED(DimSklepy[Miasto]) zwraca FAŁSZ. Odwrotnie zaznaczenie Krakowa zostawia dwa sklepy, więc SELECTEDVALUE po nazwie sklepu jest puste. Dlatego Tytuł szczegółów działa na stronie szczegółów, na którą wchodzi się z jednym sklepem, co opisujemy w lekcji o stronach Drąż wskroś i zakładkach, a myli na stronie z fragmentatorem miast.

Co zrobić krok po kroku

  1. Sprawdź, ile wartości widzi miara. Dodaj tymczasowo dwie miary i połóż je na karcie obok fragmentatora: pierwsza liczy odrębne wartości kolumny, druga je wypisuje. Na Nordvelli przy zaznaczonych Krakowie i Gdańsku pierwsza zwraca 2, druga „Gdańsk, Kraków”. Każdy wynik inny niż 1 oznacza, że SELECTEDVALUE zwróci wartość domyślną.
    Liczba wybranych miast = COUNTROWS ( VALUES ( DimSklepy[Miasto] ) )
    
    Wybrane miasta =
    CONCATENATEX ( VALUES ( DimSklepy[Miasto] ), DimSklepy[Miasto], ", ", DimSklepy[Miasto], ASC )
  2. Gdy obliczenie ma sens tylko dla jednej wartości, jak rabat w symulacji, zablokuj wielokrotne zaznaczenie. Zaznacz fragmentator, kliknij Formatuj element wizualny, rozwiń Ustawienia fragmentatora i włącz Wybór pojedynczy. Odbiorca nie zaznaczy wtedy dwóch wartości naraz, także z klawiszem Ctrl.
  3. Zostaw drugi argument SELECTEDVALUE tam, gdzie brak zaznaczenia ma znaczyć wartość domyślną, ale pokaż odbiorcy, co policzono. Miara opisu rozróżnia trzy stany: jedna wartość, kilka wartości i brak zaznaczenia. Na Nordvelli zwraca kolejno „Rabat 10%”, „Zaznaczono kilka wartości rabatu, wybierz jedną” i „Rabat 0%, nic nie zaznaczono”. Wstaw ją do karty albo do tytułu wykresu przez ikonę fx przy polu Tekst w sekcji Tytuł.
    Opis rabatu =
    SWITCH (
        TRUE (),
        HASONEVALUE ( 'Rabat proc'[Rabat proc] ), "Rabat " & VALUES ( 'Rabat proc'[Rabat proc] ) & "%",
        ISFILTERED ( 'Rabat proc'[Rabat proc] ), "Zaznaczono kilka wartości rabatu, wybierz jedną",
        "Rabat 0%, nic nie zaznaczono"
    )
  4. Tytuł, który ma działać przy kilku zaznaczeniach, zbuduj z VALUES zamiast SELECTEDVALUE. Prawy przycisk na DimSklepy w panelu Dane, Nowa miara. Na Nordvelli bez zaznaczeń miara zwraca „Wszystkie sklepy”, dla jednego sklepu jego nazwę, dla Krakowa „Nordvella Kraków Galeria, Nordvella Kraków Stare Miasto”, dla Krakowa i Gdańska trzy nazwy, a dla Warszawy i Gdańska „5 z 15 sklepów”.
    Tytuł sklepów =
    VAR Wybrane = VALUES ( DimSklepy[Nazwa] )
    VAR Liczba = COUNTROWS ( Wybrane )
    VAR Wszystkie = COUNTROWS ( ALL ( DimSklepy[Nazwa] ) )
    RETURN
        SWITCH (
            TRUE (),
            Liczba = Wszystkie, "Wszystkie sklepy",
            Liczba = 1, SELECTEDVALUE ( DimSklepy[Nazwa] ),
            Liczba <= 3, CONCATENATEX ( Wybrane, DimSklepy[Nazwa], ", ", DimSklepy[Nazwa], ASC ),
            Liczba & " z " & Wszystkie & " sklepów"
        )
  5. Odczytuj tę kolumnę, którą filtruje fragmentator. Gdy fragmentator jest po DimSklepy[Nazwa], a miara czyta DimSklepy[Miasto], wynik zależy od tego, czy zaznaczone sklepy są w jednym mieście: dwa sklepy z Warszawy dają „Warszawa”, sklep z Krakowa i sklep z Gdańska dają wartość domyślną. Tak samo w wierszu Suma tabeli: jeśli ma tam być tekst, podaj go jako drugi argument, na przykład „Wszystkie miasta”.

Jak sprawdzić, że problem zniknął

Przejdź po trzech stanach fragmentatora: brak zaznaczeń, jedna wartość i dwie wartości, i porównaj karty z miarami opisu i tytułu z kartą sprzedaży. Na Nordvelli dla Krakowa karta sprzedaży pokazuje 50 479 566,75 zł, a tytuł dwa sklepy z Krakowa, dla Krakowa i Gdańska 78 334 427,94 zł i trzy sklepy. Gdy przy dwóch zaznaczeniach widzisz wartość domyślną bez komunikatu, miara nadal opiera się na samym SELECTEDVALUE.

Przy każdej mierze z SELECTEDVALUE zapisz w opisie miary, co ma zwrócić przy kilku zaznaczeniach. Puste pole zamiast liczby to osobny temat, który opisujemy w poście o pustej wartości zamiast zera. Gdy wybór ma przełączać miary albo osie, zamiast SELECTEDVALUE użyj parametru pól, o czym piszemy w poście o miarach we fragmentatorze i na osi.

Źródła i sposób sprawdzenia

  • Microsoft Learn: SELECTEDVALUE function (DAX) (źródło)
  • Microsoft Learn: HASONEVALUE function (DAX) (źródło)
  • Microsoft Learn: ISFILTERED function (DAX) (źródło)
  • Microsoft Learn: CONCATENATEX function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: SELECTEDVALUE, HASONEVALUE i ISFILTERED przy braku, jednym i dwóch zaznaczeniach, miary Rabat proc wartość, Sprzedaż po rabacie i Tytuł szczegółów oraz nowe miary opisu i tytułu.
  • Microsoft Learn: Slicer visual in Power BI (Slicer settings, Selection) (źródło)

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

Dlaczego SELECTEDVALUE zwraca puste pole?
SELECTEDVALUE zwraca wartość tylko wtedy, gdy kontekst ogranicza kolumnę do jednej odrębnej wartości. Gdy we fragmentatorze zaznaczono kilka pozycji albo żadnej, funkcja zwraca drugi argument, a bez niego pustą wartość. Tak samo jest w wierszu Suma tabeli, gdzie kolumna nie jest filtrowana.
Co zwraca SELECTEDVALUE przy kilku zaznaczeniach we fragmentatorze?
Zwraca wartość domyślną z drugiego argumentu. Na modelu Nordvelli miara rabatu z SELECTEDVALUE i domyślnym zerem przy zaznaczeniu 10 i 12 zwraca 0, więc sprzedaż po rabacie jest równa sprzedaży bez rabatu, 467 775 009,17 zł. Lepiej wtedy pokazać komunikat albo ustawić fragmentator na wybór pojedynczy.
Jak pokazać w tytule kilka wartości wybranych we fragmentatorze?
Sklej wybrane wartości funkcją CONCATENATEX po VALUES z kolumny, z przecinkiem jako separatorem i sortowaniem. Gdy wartości jest więcej, pokaż ich liczbę z COUNTROWS. Na Nordvelli taka miara dla Krakowa i Gdańska wypisuje trzy nazwy sklepów, a dla Warszawy i Gdańska zwraca napis 5 z 15 sklepów.
Czym różni się SELECTEDVALUE od HASONEVALUE?
HASONEVALUE zwraca wartość logiczną i mówi tylko, czy kolumna ma w kontekście jedną odrębną wartość. SELECTEDVALUE od razu zwraca tę wartość albo wartość domyślną. Według dokumentacji Microsoft SELECTEDVALUE działa tak samo jak IF z HASONEVALUE, które zwraca VALUES kolumny albo wartość domyślną.

Komentarze (0)

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

Brak komentarzy...