Страницы: 1
RSS
DAX: сумма по клиентам, имеющим 2 категории
 
Добрый день, коллеги!
Никак не могу разобраться с группировками в DAX. У меня есть таблица с именами, категориями и суммами. Из нее мне нужно получить сумму только по тем именам, у которых встречается 2 категории. Делаю виртуальную таблицу с уникальными парами Имя-Показатель, но посчитать количество показателей для каждого имени никак не выходит. Подскажите, пожалуйста, как мне сделать группировку по имени с подсчетом количества показателей?
Ниже мои попытки, в приложении файл с примером.

Код
=VAR TBL = ALL('Таблица1'[Имя]; 'Таблица1'[Показатель])

VAR NM = DISTINCT('Таблица1'[Имя])

VAR ADDC = 
   ADDCOLUMNS(   TBL;
         "rn";
         CALCULATE(COUNTROWS(TBL);
         NM = 'Таблица1'[Имя]
         )
   )
   
   
VAR RES = CALCULATE(SUM('Таблица1'[Сумма]);
         FILTER(ADDC;
         [rn] = 2
         )
      )
      
RETURN 
   RES
 
Доброго времени суток!
Ungrateful,  мой вариант во вложении
Код
=VAR _t =
    ADDCOLUMNS (
        VALUES ( 'Таблица1'[Имя] );
        "Pokazatel"; CALCULATE ( DISTINCTCOUNT ( 'Таблица1'[Показатель] ) );
        "Summa"; CALCULATE ( SUM ( 'Таблица1'[Сумма] ) )
    )
VAR _result =
    SUMX ( FILTER ( _t; [Pokazatel] = 2 ); [Summa] )
RETURN
    _result
 
или так, если нужно видеть в разрезе показателей

Код
Мера 2:=VAR _t =
    ADDCOLUMNS (
        SUMMARIZE('Таблица1';'Таблица1'[Показатель];'Таблица1'[Имя] );
        "Pokazatel"; CALCULATE ( DISTINCTCOUNT ( 'Таблица1'[Показатель] );ALL('Таблица1'[Показатель]) );
        "Summa"; CALCULATE ( SUM ( 'Таблица1'[Сумма] ) )
    )
VAR _result =
    SUMX ( FILTER ( _t; [Pokazatel] = 2 ); [Summa] )
RETURN
    _result
Изменено: mechanix 85 - 26.08.2022 19:48:28
 
mechanix 85, да, с показателями удобнее)
 
Lari, mechanix 85, спасибо большое! Все немного сложнее, чем я думал. Буду вникать )
 
Вариант:
Код
=
VAR Countmark =
    COUNTROWS ( VALUES ( 'Таблица1'[Показатель] ) )
RETURN
    IF ( Countmark = 2; SUM ( 'Таблица1'[Сумма] ) )
Изменено: azma - 27.08.2022 03:07:21
 
Согласен с идеей azma, что в целях производительности не нужно считать сумму по именам, не удовлетворяющим условию.
Мои варианты:
Код
мера 3 :=
SUMX (
    VALUES ( 'Таблица1'[Имя] );
    IF (
        CALCULATE (
            DISTINCTCOUNT ( 'Таблица1'[Показатель] );
            ALL ( 'Таблица1'[Показатель] )
        ) = 2;
        CALCULATE ( SUM ( 'Таблица1'[Сумма] ) )
    )
)

Код
мера 4 :=
VAR namesWith2Indicators =
    FILTER (
        VALUES ( 'Таблица1'[Имя] );
        CALCULATE (
            DISTINCTCOUNT ( 'Таблица1'[Показатель] );
            ALL ( 'Таблица1'[Показатель] )
        ) = 2
    )
VAR result =
    CALCULATE ( SUM ( 'Таблица1'[Сумма] ); namesWith2Indicators )
RETURN
    result
 
Цитата
написал:
surkenny
Ваше решение лучше моего, я все время забываю про "Общий итог" :(
Изменено: azma - 27.08.2022 12:57:39
 
azma, в вашем варианте нужно выводить все имена, а если их сотни тысяч, этим тяжело будет пользоваться.
surkenny, супер, спасибо! Для меня не всегда очевидно поведение dax - например, вот тут мне казалось, что он должен вывести просто количество уникальных значений показателей.
Код
        CALCULATE (            DISTINCTCOUNT ( 'Таблица1'[Показатель] );
            ALL ( 'Таблица1'[Показатель] )
        )

Но теперь вижу, что если это сделать фильтром для функции FILTER (или SUMX) и задать первым аргументом уникальный перечень имен, то выборка будет как раз, какая нужна.

 
Самое смешное, что в моем рабочем варианте не оказалось таких клиентов, кто был бы одновременно с двумя показателями ))
Страницы: 1
Наверх