我有一个看起来像这样的数据集:
ID 促销 | 产品 | 地区 |
---|---|---|
SE_056 | AAA | 北 |
XT-558 | XXX | 北 |
8547Y | CCC | 北 |
TY856 | XXX | 北 |
D-895 | BBB | 南 |
ER5H | CCC | 南 |
5F6F-GD | CCC | 南 |
65-FFD | TT | 南 |
56-YU | XXX | 南 |
我想创建一个表格,显示每个产品的小计 (COUNT) 以及它们的单独百分比和累积百分比,如下所示:
产品 | 小计 | 百分比 | 射精百分比 |
---|---|---|---|
CCC | 3 | 0,33333333 | 0,333333333 |
XXX | 3 | 0,33333333 | 0,666666667 |
AAA | 1 | 0,11111111 | 0,777777778 |
BBB | 1 | 0,11111111 | 0,888888889 |
TT | 1 | 0,11111111 | 1 |
我希望这张表按最高小计到最低小计排序,并且在这种情况下也可以计算累积百分比,PBI 并不容易。我无法找到一种方法让我的表格按最高小计排序并按相同顺序计算 cum %。
您可以在报表可视化中使用一些度量来执行此操作,以计算销售数量、销售百分比、按销售排名的产品排名(然后是产品名称)和累计销售百分比:
# Sales = COUNT ( Sales[ID SALE] )
% Sales =
DIVIDE (
[# Sales],
CALCULATE (
[# Sales],
REMOVEFILTERS ( Sales[PRODUCT] )
)
)
% Sales (Cumulative) =
VAR CurrentRank =
IF (
ISINSCOPE ( Sales[PRODUCT] ),
[Rank by Sales then Product],
DISTINCTCOUNT ( Sales[PRODUCT] )
)
RETURN
SUMX (
ALL ( Sales[PRODUCT] ),
IF (
[Rank by Sales then Product] <= CurrentRank,
[% Sales],
BLANK()
)
)
Rank by Product =
RANKX (
ALL ( Sales[PRODUCT] ),
FIRSTNONBLANK ( Sales[PRODUCT], 1 ),,
ASC,
Dense
)
Rank by Sales then Product =
RANKX (
ALL ( Sales[PRODUCT] ),
[# Sales] + ( 1 / [Rank by Product] ),,
DESC,
Dense
)
输出示例:
编辑:您可以执行百分比销售额(累积)度量,并删除“排名”度量,但它的可读性明显较差:
% Sales (Cumulative) =
VAR CurrentRank =
IF (
ISINSCOPE ( Sales[PRODUCT] ),
RANKX (
ALL ( Sales[PRODUCT] ),
[# Sales] +
DIVIDE (
1,
CALCULATE (
RANKX (
ALL ( Sales[PRODUCT] ),
FIRSTNONBLANK ( Sales[PRODUCT], 1 ),,
ASC,
Dense
)
)
),,
DESC,
Dense
),
DISTINCTCOUNT ( Sales[PRODUCT] )
)
RETURN
SUMX (
ALL ( Sales[PRODUCT] ),
IF (
RANKX (
ALL ( Sales[PRODUCT] ),
[# Sales] +
DIVIDE (
1,
CALCULATE (
RANKX (
ALL ( Sales[PRODUCT] ),
FIRSTNONBLANK ( Sales[PRODUCT], 1 ),,
ASC,
Dense
)
)
),,
DESC,
Dense
) <= CurrentRank,
[% Sales],
BLANK()
)
)
您还可以在查询编辑器中完成此操作(主页=>转换数据)。
在高级编辑器中,粘贴下面的代码,但前几行除外,这些代码将在现有数据中读取,并可能设置数据类型。
然后检查代码注释并探索“应用步骤”窗口(关闭高级编辑器后)以了解算法。
let
//Change next line to reflect your actual data source
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
//set data type
#"Changed Type" = Table.TransformColumnTypes(Source,{{"ID SALE", type text}, {"PRODUCT", type text}, {"REGION", type text}}),
//Group by Product and Aggregate by Count
#"Grouped Rows" = Table.Group(#"Changed Type", {"PRODUCT"}, {
{"Subtotal", each Table.RowCount(_), Int64.Type}}),
//Sort subtotal row descending
#"Sorted Rows" = Table.Sort(#"Grouped Rows",{{"Subtotal", Order.Descending}}),
//Add column with percentage for each subtotal
#"Added Custom" = Table.AddColumn(#"Sorted Rows", "Percentage",
each [Subtotal] / List.Sum(#"Sorted Rows"[Subtotal]), Percentage.Type),
//Add Running total calculation for the cumulative percentage column
#"Cumulative Percentage" =
Table.FromColumns(
Table.ToColumns(#"Added Custom") &
{List.Generate(
()=>[cp=#"Added Custom"[Percentage]{0}, idx=0],
each [idx] < Table.RowCount(#"Added Custom"),
each [cp=List.Sum({[cp]}) + #"Added Custom"[Percentage]{[idx]+1}, idx=[idx]+1],
each [cp])},
type table[PRODUCT=text,Subtotal=Int64.Type, Percentage = Percentage.Type, Cumulative Percentage = Percentage.Type]
)
in
#"Cumulative Percentage"
一个大而简单的措施,不需要评论。您可以在视觉效果中使用它并作为进一步计算的基础。结果未排序,但您可以在视觉上按照您喜欢的方式进行排序,并且不会影响值。
VAR tbl =
ADDCOLUMNS(
VALUES('dataset'[PRODUCT])
,"subtotal",CALCULATE(CountRows('dataset'))
,"Percentage",CALCULATE(CountRows('dataset'))/CountRows('dataset')
)
VAR withRankingValue1 =
ADDCOLUMNS(
tbl
,"rowsWithLowerPercentage",VAR val=[subtotal] RETURN COUNTROWS(FILTER(tbl,[subtotal]>val))
)
VAR withRankingValue2 =
ADDCOLUMNS(
withRankingValue1
,"rankInGroup"
,
VAR podVal=[PRODUCT]
VAR rv1Val=[rowsWithLowerPercentage]
RETURN
COUNTROWS(
FILTER(
withRankingValue1
,AND(
[PRODUCT]<podVal
,[rowsWithLowerPercentage]=rv1Val
)
)
)+1
)
VAR withFinalRanking =
ADDCOLUMNS(
withRankingValue2
,"Rank",INT(CONCATENATE([rowsWithLowerPercentage],[rankInGroup]))
)
VAR Result =
ADDCOLUMNS(
withFinalRanking
,"Cum Percentage",
VAR rankVal=[Rank]
VAR filtTbl = FILTER(withFinalRanking,[Rank]<=rankVal)
RETURN SUMX(filtTbl,[Percentage])
)
Return
SUMX(Result,[Cum Percentage])