В этом примере у меня есть еженедельный объем продаж по магазинам одежды и обуви (у меня есть большая база данных с несколькими торговыми точками и данными, охватывающими более 50 000 строк). В первую и вторую неделю у меня есть только продажи из аутлета «Одежда-1». На третьей неделе я открываю новый магазин одежды. На четвертой неделе я открываю свой первый магазин обуви. На 6-й неделе открывается мой третий магазин одежды, а на 7-й неделе — второй магазин обуви. По финансовым причинам мне пришлось закрыть второй магазин одежды на восьмой неделе.
Мне нужно найти эффективный и общий объем продаж за неделю по магазинам одежды и обуви. Например, на шестой неделе у меня всего 25 продаж одежды в трех торговых точках. Таким образом, мои эффективные продажи одежды на этой неделе составят 25/3 = 8,33 на одну торговую точку. На восьмой неделе закрывается мой второй магазин одежды, поэтому мои эффективные продажи одежды на этой неделе составляют 19/2 = 9,5 на магазин. На той же неделе мои эффективные продажи обуви составляют 17/2 = 8,5.
Я надеялся найти в PowerBI код DAX, который мог бы помочь в анализе.
Я пробовал анализировать данные в Excel, но вычисление каждой категории занимает целую вечность. В некоторых случаях у меня почти 14 торговых точек, которые открываются и закрываются в разные недели, поэтому я действительно не могу понять, как действовать дальше.
Дополнительный вопрос: Теперь, если бы на 4-й неделе в магазине «Одежда-1» не было продаж, но он был открыт, у меня не было бы скандала из-за одежды-1 на 4-й неделе. Я знаю, что магазин не закрыт, потому что в последующие недели у него будут распродажи. Если я пересчитаю, основываясь на этой логике, мой общий объем продаж одежды составит 24 на четвертой неделе, а мой средний объем продаж составит 12, несмотря на то, что продается только одежда-2. Это тоже можно как-то включить?
Я считаю, что ваши примеры некорректны. Неделя6:25/3=>8.333
нет 6.333
. Неделя8: Всего обуви => 17
не 13
В конце добавлен дополнительный, более сложный вопрос.
Что касается вашего второго вопроса, вы, конечно, можете найти шаблон sales-no sales-sales
и скорректировать его, но этого недостаточно, чтобы определить, закрыт ли магазин или открыт ли он без продаж. Если в магазине нет продаж в начале или в конце вашего периода времени, нет способа отличить no sales
от not open
. Кроме того, если магазин временно закрыт посередине, ваш метод не будет различаться. Вам следует поговорить с тем, кто предоставляет вам эту базу данных, чтобы включить достаточную информацию для различения. Проще всего было бы добавить строку Sale=0
.
Я больше знаком с кодом 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 Вам придется предоставить дополнительную информацию. Например, как отличить магазин, в котором не было продаж на 8-й и 9-й неделях (последние две недели), от магазина, который закрылся на 8-й неделе? Как бы вы отличали магазин, который был временно закрыт, от магазина, в котором не было продаж? Было бы лучше ввести ваши данные, чтобы магазин, который был открыт, но не имел продаж, показывал в ваших данных продажи, равные нулю (0).
Предположим, нет магазинов, которые временно закрываются. Либо они закрываются навсегда, либо открыты, но продаж нет. Один из способов отличить магазин без продаж от магазина, который закрылся навсегда, заключается в том, что в последующие недели в открытом магазине будут происходить некоторые продажи. Например, когда Одежда-2 закрылась навсегда на 8-й неделе, она больше не появлялась после этого. Но если на 4-й неделе у одежды-1 не было продаж, но она была открыта, то продажи продолжатся и на 5-8-й неделе.
@NoviceatPBI Это не кажется надежным методом. Что, если продажи одежды-2 были бы на 10-й неделе? Тогда ваши цифры для 9-й недели были бы неверными, поскольку не было бы способа определить, было ли оно открыто в течение этой последней недели.
Я понимаю, что здесь есть ошибка, но это совершенно нормально. В Excel я попытался отсортировать данные по номеру недели. а затем поискал уникальное количество магазинов одежды за указанную неделю. Если есть изменения, то я знаю, что один из магазинов закрылся на неопределенный срок.
@NoviceatPBI См. последнее редактирование для добавления записей об нулевых продажах, когда в номерах недель для конкретного магазина есть пробел. Это должно делать то, что вы описываете.
Спасибо, Рон, за твои замечательные советы. :-). Соответственно сделаю.
Я думаю, первое, что вам нужно, это количество активных торговых точек. =DISTINCTCOUNT('Продажи'[Аутлет]) В итоге вы получите что-то вроде этого: Количество активных торговых точек 1 1 2 3 3 4 5 4 4 5