#powerbi #dax #etl #cumulative-sum #measure
Вопрос:
У меня есть два стола:
- таблица пользователей (содержит: регистрационные данные пользователя. столбцы: идентификатор пользователя, дата создания)
- таблица заказов клиентов (содержит: историю заказов. столбцы: идентификатор пользователя, дата заказа, идентификатор заказа)
*пользователь и клиент — это не одно и то же. когда пользователь регистрирует свой первый заказ, он становится клиентом.
Для каждого месяца каждого года мне нужно накопительное количество отдельных пользователей и накопительное количество отдельных клиентов, потому что, наконец, я хочу рассчитать отношение накопительного количества отдельных клиентов к накопительному количеству отдельных пользователей за каждый месяц.
Я не знаю, как я могу рассчитать накопительные значения и соотношение, которые я сказал, используя DAX.
Обратите внимание, что если клиент регистрирует более одного заказа в месяц, я хочу посчитать его только один раз за этот месяц, и если он регистрирует новый заказ в следующие месяцы, я также считаю его в каждом новом месяце.
Может быть, эти фотографии помогут вам лучше понять мой вопрос.
-Я не считаю столбцы count_of_users и count_of_customers в своих таблицах. Я должен их рассчитать.
таблица пользователей:
идентификатор пользователя | 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. Не знаете, чего вы ожидаете, что я буду делать со всем вашим отчетом? Если вы еще не используете таблицу дат, самое время начать.