在Power BI中计算长型数据的帕累托表

问题描述 投票:0回答:3

我有一个看起来像这样的数据集:

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 %。

powerbi dax
3个回答
2
投票

您可以在报表可视化中使用一些度量来执行此操作,以计算销售数量、销售百分比、按销售排名的产品排名(然后是产品名称)和累计销售百分比:

# 销售:
# 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
    )

输出示例:

Sample output

编辑:您可以执行百分比销售额(累积)度量,并删除“排名”度量,但它的可读性明显较差:

% 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()
        )
    )

2
投票

您还可以在查询编辑器中完成此操作(主页=>转换数据)。

在高级编辑器中,粘贴下面的代码,但前几行除外,这些代码将在现有数据中读取,并可能设置数据类型。

然后检查代码注释并探索“应用步骤”窗口(关闭高级编辑器后)以了解算法。

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"

结果
enter image description here


1
投票

一个大而简单的措施,不需要评论。您可以在视觉效果中使用它并作为进一步计算的基础。结果未排序,但您可以在视觉上按照您喜欢的方式进行排序,并且不会影响值。

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])

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.