Оценка DAX Grouping

Aug 16 2020

В этой мере - я создаю временную таблицу для группировки по идентификатору клиента и возвращаю год минимальной даты заказа для каждого клиента. Затем я хочу подсчитать количество клиентов, которые появляются за данный год (в основном, это просто количество строк).

То, что я изо всех сил пытаюсь понять, это то, что эта формула, похоже, не смотрит на SUMMARIZEтаблицу внутри нее. Если я помещаю год и эту меру в матрицу, он учитывается на основе необработанной таблицы, а не сгруппированной версии, созданной SUMMARIZEв формуле. Есть идеи, почему он так оценивается?

COUNTROWS(
SUMMARIZE(
    Orders,
    Orders[Customer ID],
    "min_order_date_year",
    MIN(Orders[Order Date].[Year])))

Ответы

1 mkRabbani Aug 16 2020 at 14:14

Формула в порядке согласно логике, которую вы ей предоставили. Вы должны прояснить как свои требования, так и то, что вы пишете в своем коде. Ваша формула возвращает именно то, что вы ей указываете.

Если я правильно понимаю, вам просто нужно количество клиентов за минимальный год. Например, если у вас есть 6 уникальных клиентов на 2019 год и 11 уникальных клиентов на 2020 год, вы ищете здесь значение 6, которое будет возвращено по вашим меркам.

Теперь, что на самом деле возвращает ваша сводная таблица? если вы создадите отдельную настраиваемую таблицу только для кода суммирования, как показано ниже, вы увидите, что таблица фактически будет содержать все ваше имя / идентификатор клиента в первом столбце, а во втором столбце будет указан МИН год, доступный для этого клиента.

orders_summarize = 
SUMMARIZE(
    Orders,
    Orders[customer id],
    "min_order_date_year",MIN(Orders[Order Date].[Year])
)

Итак, в сводной таблице у вас есть список всех клиентов. И теперь вы подсчитываете строки своей сводной таблицы, которая фактически возвращает общее количество уникальных клиентов.

Наконец, если вы хотите подсчитать клиентов за определенный год (например, MIN год), выполните следующие действия:

Шаг 1. Создайте настраиваемую сводную таблицу, как показано ниже.

store_summarized_table = 
SUMMARIZE(
    store,
    store[Customer ID],
    "mindate",MIN(store[Order Date])
)

Шаг 2: создайте меру как-

count_cust_id = COUNT('store_summarized_table'[Customer ID])

Шаг 3: Теперь настройте визуальные эффекты Matrix, как показано на изображении ниже. Вы также можете получить результат на изображении -

Чтобы избежать физической таблицы, вы можете сделать это ниже:

Шаг 1. Создайте настраиваемый столбец, как показано ниже.

is_min_year = 

// -- keep current row's customer id to a variable
VAR current_cust_id = store[Customer ID]
// -- keep current row's YEAR value to a variable
VAR current_year = store[Order Date].[Year]

// -- find the MIN YEAR from order date for the current row customer id
VAR min_year_current_custommer_id =  
CALCULATE(
    MIN(store[Order Date].[Year]),
    FILTER(
        store,
        store[Customer ID] = current_cust_id
    )
)

// -- check the current row's year is the MIN year of order date for the customer as well or not.
RETURN IF(current_year = min_year_current_custommer_id, 1,0)

ИЛИ создайте меру как-

is_min_year_measure = 

VAR min_order_year_for_current_customer = 
CALCULATE(
    MIN(store[Order Date].[Year]),
    FILTER(
        ALL(store),
        store[Customer ID] = MIN(store[Customer ID])
    )
)

RETURN
IF ( MIN(store[Order Date].[Year]) = min_order_year_for_current_customer, 1,0)

Шаг 2. Создайте меру, как показано ниже.

Для созданного настраиваемого столбца

count_cust_for_min_year = 
CALCULATE(
    DISTINCTCOUNT(store[Customer ID]),
    FILTER(
        store,
        store[is_min_year] = 1
    )
)

Для созданной меры

count_cust_for_min_year = 
CALCULATE(
    DISTINCTCOUNT(store[Customer ID]),
    FILTER(
        store,
        [is_min_year_measure] = 1
    )
)

Теперь добавьте «Дата заказа» и измерьте «count_cust_for_min_year» в свою матрицу. Выход будет таким же, как показано ниже.