Простое предложение Having, созданное с помощью меры Power BI

#sql #powerbi #dax #measure

Вопрос:

Я создал эту простую таблицу в SQL:

 create table testTable (
date date not null,
leader varchar(20),
name varchar(20)
)


insert into testTable 
values
('2021-01-01', 'KIM', 'Anders'),
('2021-01-02', 'KIM', 'Annika'),
('2021-01-03', 'KIM', 'Anna'),
('2021-01-04', 'KIM', 'Anna'),
('2021-01-03', 'KIM', 'Annika'),
('2021-01-01', 'JOHAN', 'Sara'),
('2021-01-02', 'JOHAN', 'Sara'),
('2021-01-03', 'JOHAN', 'Sara')
 

Я пытаюсь получить эквивалентное решение для следующего кода в измерении dax, если это возможно

 select max(leader), name, count(name)
from testTable
group by name
having count(name) >= 2
 

Результат, который я ищу, таков.

Лидер Мера
ким 2
ЙОХАН 1

Ответ №1:

Подумайте о HAVING фильтре, который появляется после группировки. Так что что-то вроде

 Measure = COUNTROWS(filter(SUMMARIZECOLUMNS('Table'[Name],"Count",count('Table'[Name])), [Count]>=2))
 

И вот простой способ представить тестовые данные для вопросов DAX, полностью в DAX:

 testTable = SELECTCOLUMNS
(
    {
         (date(2021,01,01),"KIM","Anders")
        ,(date(2021,01,02),"KIM","Annika")
        ,(date(2021,01,03),"KIM","Anna")
        ,(date(2021,01,04),"KIM","Anna")
        ,(date(2021,01,03),"KIM","Annika")
        ,(date(2021,01,01),"JOHAN","Sara")
        ,(date(2021,01,02),"JOHAN","Sara")
        ,(date(2021,01,03),"JOHAN","Sara")
    }, "date",   [Value1]
     , "leader", [Value2]
     , "name",   [Value3]
)
 

Это гораздо более простой способ воспроизвести сценарий, чем создание таблицы в SQL Server и загрузка ее с помощью Power Query или использование формы «Ввод данных» в PowerBI, которая создает таблицу в Power Query.

Комментарии:

1. Спасибо! 🙂 он сам по себе получает правильное значение, но он несовместим с включением лидера в таблицу. Контекст фильтра не работает

2. Поэтому добавьте желаемый результат к своему вопросу.

3. Я думал, что это подразумевается, но да, я мог бы быть более конкретным

4. Возможно ли теперь использовать SUMMARIZECOLUMNS внутри мер?

Ответ №2:

Изменить: после добавления желаемого результата в вопрос ответ меняется следующим образом

Возможным решением является реализация меры, которая подсчитывает количество имен, которые появляются более одного раза для выбранного лидера

 # Names ge 2 =
COUNTROWS (
    FILTER (
        VALUES ( Test[name] ),
        CALCULATE ( COUNTROWS ( Test ), ALLEXCEPT ( Test, Test[name], Test[leader] ) ) > 1
    )
)
 

вот рабочий пример на dax.do

 DEFINE
    TABLE Test =
        DATATABLE (
            "date", DATETIME,
            "leader", STRING,
            "name", STRING,
            {
                { "2021-01-01", "KIM", "Anders" },
                { "2021-01-02", "KIM", "Annika" },
                { "2021-01-03", "KIM", "Anna" },
                { "2021-01-04", "KIM", "Anna" },
                { "2021-01-03", "KIM", "Annika" },
                { "2021-01-01", "JOHAN", "Sara" },
                { "2021-01-02", "JOHAN", "Sara" },
                { "2021-01-03", "JOHAN", "Sara" }
            }
        )
    MEASURE Test[# Names ge 2] =
        COUNTROWS (
            FILTER (
                VALUES ( Test[name] ),
                CALCULATE ( COUNTROWS ( Test ), ALLEXCEPT ( Test, Test[name], Test[leader] ) ) > 1
            )
        )
EVALUATE
SUMMARIZECOLUMNS (
    Test[leader],
    "# Names ge 2", [# Names ge 2]
)
 

и результирующий результат

выходная таблица

Я оставил меру моего предыдущего ответа на оригинале dax.do, который вернул этот вывод

выходная таблица старая