Вычисление совокупных значений в Power BI

#powerbi #dax #etl #cumulative-sum #measure

Вопрос:

У меня есть два стола:

  • таблица пользователей (содержит: регистрационные данные пользователя. столбцы: идентификатор пользователя, дата создания)
  • таблица заказов клиентов (содержит: историю заказов. столбцы: идентификатор пользователя, дата заказа, идентификатор заказа)

*пользователь и клиент — это не одно и то же. когда пользователь регистрирует свой первый заказ, он становится клиентом.

Для каждого месяца каждого года мне нужно накопительное количество отдельных пользователей и накопительное количество отдельных клиентов, потому что, наконец, я хочу рассчитать отношение накопительного количества отдельных клиентов к накопительному количеству отдельных пользователей за каждый месяц.

Я не знаю, как я могу рассчитать накопительные значения и соотношение, которые я сказал, используя DAX.

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

Может быть, эти фотографии помогут вам лучше понять мой вопрос.

-Я не считаю столбцы count_of_users и count_of_customers в своих таблицах. Я должен их рассчитать.

1

2

3

таблица пользователей:

идентификатор пользователя create_date
1 2017-12-03
2 2018-01-01
3 2018-01-01
4 2018-02-04
5 2018-03-10
6 2018-04-07
7 2018-04-08
8 2018-09-12
9 2018-10-02
10 2018-10-02
11 2018-10-09
12 2018-10-11
13 2018-10-12
14 2018-10-12
15 2018-10-20

таблица заказов клиентов:

идентификатор пользователя дата заказа идентификатор заказа
1 2018-03-28 120
1 2018-03-28 514
1 2018-03-30 426
2 2018-02-11 125
2 2018-03-01 547
3 2018-02-10 588
3 2018-04-03 111
4 2018-02-10 697
5 2018-04-02 403
5 2018-04-05 321
6 2018-04-09 909
11 2018-10-25 8401

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

1. Пожалуйста, добавьте образцы данных (в виде текста) для обеих таблиц

2. Я добавил обе таблицы. @РАДО

Ответ №1:

Для этого вам нужно несколько строительных блоков. Вот модель данных, которую я использовал:

введите описание изображения здесь

<редактировать><редактировать> Я вижу, что идентификаторы пользователей в разных таблицах не совпадают, в этом случае вы можете опустить связь между таблицами, и обе связи из Calendar таблицы будут активными — без необходимости изменять семантику отношений в count_of_customer мере. </править></править>

Таблица календаря важна, потому что мы не можем полагаться на один столбец даты для агрегирования данных из разных таблиц, поэтому мы создаем общую таблицу календаря с помощью этого примера кода DAX:

 Calendar = 
ADDCOLUMNS (
    CALENDARAUTO () ,
    "Year" , YEAR ( [Date] ) ,
    "Month" , FORMAT ( [Date] , "MMM" ) ,
    "Month-Year" , FORMAT ( [Date] , "MMM")amp;"-"amp;YEAR ( [Date] ) ,
    "YearMonthNo" , YEAR ( [Date] ) * 12   MONTH ( [Date] ) - 1
)
 

Обязательно отсортируйте Month-Year столбец по YearMonthNo столбцу, чтобы ваши таблицы выглядели красиво:

введите описание изображения здесь

Установите свои отношения, как показано на рисунке, с активной связью от Calendar до user — если нет, меры не будут работать, если вы не измените отношения соответствующим образом в коде! В моей модели данных неактивная связь находится между Calendar и customer order .

Далее следуют меры, которые мы будем использовать для этого. Во-первых, мы подсчитываем пользователей, простой подсчет строк:

 count_of_users = COUNTROWS ( user )
 

Затем мы подсчитываем различные идентификаторы пользователей в таблице заказов для подсчета клиентов, здесь нам нужно использовать неактивную связь между Calendar и customer order и для этого мы должны вызвать CALCULATE :

 count_of_customers = 
CALCULATE (
    DISTINCTCOUNT ( 'customer order'[user_id] ) ,
    USERELATIONSHIP (
        'Calendar'[Date] ,
        'customer order'[order_date]
    )
)
 

Мы можем использовать эту меру для совокупного подсчета пользователей:

 cumulative_users = 
VAR _maxVisibleDate = MAX ( 'Calendar'[Date] ) 
RETURN
CALCULATE ( 
    [count_of_users] , 
    ALL ( 'Calendar' ) , 
    'Calendar'[Date] <= _maxVisibleDate
)
 

И эта мера позволяет подсчитывать совокупных клиентов в месяц:

 cumulative_customers = 
VAR _maxVisibleDate = MAX ( 'Calendar'[Date] ) 
RETURN
CALCULATE ( 
    SUMX ( 
        VALUES ( 'Calendar'[YearMonthNo] ) ,
        [count_of_customers] 
    ),
    ALL ( 'Calendar' ) , 
    'Calendar'[Date] <= _maxVisibleDate
)
 

Наконец, нам нужно соотношение этих последних совокупных показателей:

 cumulative_customers/users = 
DIVIDE (  
    [cumulative_customers] , 
    [cumulative_users] 
)
 

И вот ваш результат:

введите описание изображения здесь

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

1. Вы сказали:» идентификатор пользователя в разных таблицах не совпадает». Что ты имеешь в виду? обратите внимание, что не все пользователи являются клиентами. но все клиенты-это пользователи. @Маркус

2. Если я использую таблицу календаря, я вижу ошибки в других своих отчетах, которые зависят от даты. @Маркус

3. Не знаете, чего вы ожидаете, что я буду делать со всем вашим отчетом? Если вы еще не используете таблицу дат, самое время начать.