Как найти средний объем продаж в неделю для категории торговых точек, если каждую неделю в PowerBI есть несколько данных и категорий торговых точек?

В этом примере у меня есть еженедельный объем продаж по магазинам одежды и обуви (у меня есть большая база данных с несколькими торговыми точками и данными, охватывающими более 50 000 строк). В первую и вторую неделю у меня есть только продажи из аутлета «Одежда-1». На третьей неделе я открываю новый магазин одежды. На четвертой неделе я открываю свой первый магазин обуви. На 6-й неделе открывается мой третий магазин одежды, а на 7-й неделе — второй магазин обуви. По финансовым причинам мне пришлось закрыть второй магазин одежды на восьмой неделе.

Неделя Выход Продажи 1 Одежда-1 9 1 Одежда-1 5 2 Одежда-1 4 2 Одежда-1 5 2 Одежда-1 6 3 Одежда-1 10 3 Одежда-1 6 3 Одежда-2 4 3 Одежда-2 7 3 Одежда-2 6 4 Одежда-1 2 4 Одежда-2 10 4 Одежда-2 14 4 Обувь-1 1 4 Обувь-1 3 4 Обувь-1 2 4 Обувь-1 3 5 Одежда-1 5 5 Одежда-1 3 5 Одежда-1 2 5 Одежда-2 3 5 Одежда-2 6 5 Одежда-2 7 5 Одежда-2 7 5 Одежда-2 9 5 Обувь-1 2 5 Обувь-1 11 6 Одежда-1 4 6 Одежда-2 8 6 Одежда-3 8 6 Одежда-3 5 6 Обувь-1 3 7 Одежда-1 10 7 Одежда-1 4 7 Одежда-2 6 7 Одежда-2 8 7 Одежда-3 6 7 Обувь-1 9 7 Обувь-2 6 7 Обувь-2 5 7 Обувь-2 4 8 Одежда-1 9 8 Одежда-3 5 8 Одежда-3 5 8 Обувь-1 4 8 Обувь-1 4 8 Обувь-2 9 9 Одежда-1 9 9 Одежда-3 5 9 Обувь-1 4 9 Обувь-2 9

Мне нужно найти эффективный и общий объем продаж за неделю по магазинам одежды и обуви. Например, на шестой неделе у меня всего 25 продаж одежды в трех торговых точках. Таким образом, мои эффективные продажи одежды на этой неделе составят 25/3 = 8,33 на одну торговую точку. На восьмой неделе закрывается мой второй магазин одежды, поэтому мои эффективные продажи одежды на этой неделе составляют 19/2 = 9,5 на магазин. На той же неделе мои эффективные продажи обуви составляют 17/2 = 8,5.

Я надеялся найти в PowerBI код DAX, который мог бы помочь в анализе.

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

Дополнительный вопрос: Теперь, если бы на 4-й неделе в магазине «Одежда-1» не было продаж, но он был открыт, у меня не было бы скандала из-за одежды-1 на 4-й неделе. Я знаю, что магазин не закрыт, потому что в последующие недели у него будут распродажи. Если я пересчитаю, основываясь на этой логике, мой общий объем продаж одежды составит 24 на четвертой неделе, а мой средний объем продаж составит 12, несмотря на то, что продается только одежда-2. Это тоже можно как-то включить?

Я думаю, первое, что вам нужно, это количество активных торговых точек. =DISTINCTCOUNT('Продажи'[Аутлет]) В итоге вы получите что-то вроде этого: Количество активных торговых точек 1 1 2 3 3 4 5 4 4 5

Pieter 09.04.2024 21:06

Я считаю, что ваши примеры некорректны. Неделя6:25/3=>8.333 нет 6.333. Неделя8: Всего обуви => 17 не 13

Ron Rosenfeld 10.04.2024 02:11

В конце добавлен дополнительный, более сложный вопрос.

NoviceatPBI 10.04.2024 08:52

Что касается вашего второго вопроса, вы, конечно, можете найти шаблон sales-no sales-sales и скорректировать его, но этого недостаточно, чтобы определить, закрыт ли магазин или открыт ли он без продаж. Если в магазине нет продаж в начале или в конце вашего периода времени, нет способа отличить no sales от not open. Кроме того, если магазин временно закрыт посередине, ваш метод не будет различаться. Вам следует поговорить с тем, кто предоставляет вам эту базу данных, чтобы включить достаточную информацию для различения. Проще всего было бы добавить строку Sale=0.

Ron Rosenfeld 10.04.2024 12:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я больше знаком с кодом Power Query M, где все довольно просто:

В расширенном редакторе:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("ldPBCsIwEATQf8m5gt2kbfYs+BOlhx5EBbEgBX9fbCAhmUnRYx/DZjtNx9G0pjGnx7Le7s/r4fugZmoIdxtLyY5zJd1vbEtuj9xJXOKZwAPnMMSVswVZ0iroLvp5Wdb3ZX6F1TlbzrKX7niJwJW0IAtPp1aAh79YI5O3BG5DVz2/Qn053CPbOneRSbND5cKBO+RUFrBHtlk6W0WRhaclvg9wWNDzf9bzUnY4W9D9zOnbK99E+ZHKZyuZPX0A", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Week = _t, Outlet = _t, Sales = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Week", Int64.Type}, {"Outlet", type text}, {"Sales", Int64.Type}}),
    
//add columnm to determine Footwear vs Clothing type
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Type", each Text.Split([Outlet],"-"){0}, type text),

//Group by Type and Week
//Then compute total and average per unique store
    #"Grouped Rows" = Table.Group(#"Added Custom", {"Week", "Type"}, {
        {"Total Sales", each List.Sum([Sales]), type nullable number}, 
        {"Sales per Outlet", each List.Sum([Sales]) / List.Count(List.Distinct([Outlet])), type nullable number}})
in
    #"Grouped Rows"

Чтобы сделать все это в DAX, вы можете попробовать:

  • Добавьте столбец в исходную таблицу (с именем SalesTable
    Type = LEFT([Outlet],FIND("-",[Outlet])-1)

Затем создайте новую таблицу:

SummaryTable = SUMMARIZE('SalesTable'  
      ,[Week] 
      , [Type]
      , "Total Sales", SUM('SalesTable'[Sales])
      , "Average Sales", SUM('SalesTable'[Sales]) / DISTINCTCOUNT('SalesTable'[Outlet])
      )  

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

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("ldNBCsIwEAXQu2RdwUzSNrMWvETpwoWoIBak4PXFRhKa/1N02cdnZjJJh8FY05jDfZqvt8dl9/lQMzaE24WlZM+5ku4WdiXbPXcSl9QTuOcci/iSvz3RffLjNM2v8+kZZ+TsOMtWuuXbAq6kBVl4Oh8fuP+LNTE5JbCNu+r4W+nK4gHZ1blNTDbbV14WuEfOywIOyG6VXo2iyMLTks4DHAcM/OcMfCkbvBrQ/8z57pVPoryl8trKa1tymeMb", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Week = _t, Outlet = _t, Sales = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Week", Int64.Type}, {"Outlet", type text}, {"Sales", type number}}),
   
//Find missing weeks and create a zero(0) sales record for those weeks
    #"Grouped Outlet" = Table.Group(#"Changed Type", {"Outlet"}, {
        {"Missing Weeks", (t)=>
            let 
                #"Missing" = List.RemoveMatchingItems({List.Min(t[Week])..List.Max(t[Week])}, t[Week]),
                #"Records"= List.Accumulate(
                    #"Missing",
                    {},
                    (s,c)=> s & {[Outlet=t[Outlet]{0}, Week=c, Sales=0]}
                )
            in Table.FromRecords(#"Records"), type table[Outlet=text, Week=Int64.Type, Sales=number]}}),
    #"Expanded Missing Weeks" = Table.ExpandTableColumn(#"Grouped Outlet", "Missing Weeks", {"Week", "Sales"}),
    #"Filtered Rows" = Table.SelectRows(#"Expanded Missing Weeks", each ([Week] <> null)),

//Combine missing weeks with original table
    #"Combine" = Table.Combine({#"Changed Type", #"Filtered Rows"}),
    #"Filtered Rows1" = Table.SelectRows(Combine, each true),
    #"Sorted Rows" = Table.Sort(#"Filtered Rows1",{{"Week", Order.Ascending}, {"Outlet", Order.Ascending}}),

//add columnm to determine Footwear vs Clothing type
    #"Added Custom" = Table.AddColumn(#"Sorted Rows", "Type", each Text.Split([Outlet],"-"){0}, type text),

//Group by Type and Week
//Then compute total and average per unique store
    #"Grouped Rows" = Table.Group(#"Added Custom", {"Week", "Type"}, {
        {"Total Sales", each List.Sum([Sales]), type nullable number}, 
        {"Sales per Outlet", each List.Sum([Sales]) / List.Count(List.Distinct([Outlet])), type nullable number}})
in
    #"Grouped Rows"

Большое спасибо, Рон. Да, примеры были неправильными, я их изменил. Теперь, если бы на 4-й неделе в магазине «Одежда-1» не было продаж, но он был открыт, у меня не было бы скандала из-за одежды-1 на 4-й неделе. Я знаю, что магазин не закрыт, потому что в последующие недели у него будут распродажи. Если я пересчитаю, основываясь на этой логике, мой общий объем продаж одежды составит 24 на четвертой неделе, а мой средний объем продаж составит 12, несмотря на то, что продается только одежда-2. Это тоже можно как-то включить?

NoviceatPBI 10.04.2024 08:26

@NoviceatPBI Вам придется предоставить дополнительную информацию. Например, как отличить магазин, в котором не было продаж на 8-й и 9-й неделях (последние две недели), от магазина, который закрылся на 8-й неделе? Как бы вы отличали магазин, который был временно закрыт, от магазина, в котором не было продаж? Было бы лучше ввести ваши данные, чтобы магазин, который был открыт, но не имел продаж, показывал в ваших данных продажи, равные нулю (0).

Ron Rosenfeld 10.04.2024 11:01

Предположим, нет магазинов, которые временно закрываются. Либо они закрываются навсегда, либо открыты, но продаж нет. Один из способов отличить магазин без продаж от магазина, который закрылся навсегда, заключается в том, что в последующие недели в открытом магазине будут происходить некоторые продажи. Например, когда Одежда-2 закрылась навсегда на 8-й неделе, она больше не появлялась после этого. Но если на 4-й неделе у одежды-1 не было продаж, но она была открыта, то продажи продолжатся и на 5-8-й неделе.

NoviceatPBI 10.04.2024 12:26

@NoviceatPBI Это не кажется надежным методом. Что, если продажи одежды-2 были бы на 10-й неделе? Тогда ваши цифры для 9-й недели были бы неверными, поскольку не было бы способа определить, было ли оно открыто в течение этой последней недели.

Ron Rosenfeld 10.04.2024 13:20

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

NoviceatPBI 10.04.2024 14:50

@NoviceatPBI См. последнее редактирование для добавления записей об нулевых продажах, когда в номерах недель для конкретного магазина есть пробел. Это должно делать то, что вы описываете.

Ron Rosenfeld 10.04.2024 17:32

Спасибо, Рон, за твои замечательные советы. :-). Соответственно сделаю.

NoviceatPBI 11.04.2024 11:52

Другие вопросы по теме