列表报告,每行显示一个特定行的百分比

List report with each line showing percentage of one specific line

我有一个包含多行的 Power BI 报告(它是 P 和 L 报告)显示在列表可视化中。

它是从 SQL

中的视图填充的

其中一行是'Total Revenue'

我需要每一行以百分比形式显示其占总收入的比例:

LINE           MTH     %
------------------------
Line1            5    10 
Total Revenue   50   100
Line2           20    40
Line3            4     8
Line4           12    24

请注意,MTH 加起来不等于总收入,所以我不能只取总收入,我需要将称为总收入的行作为分母

这是我在这里尝试做的事情的完美示例:

https://msdn.microsoft.com/en-us/library/ee634760.aspx

但是当我尝试这种方法时(首先只是为了获取分母),我只在总收入行中获取了一个值,在其他行中获取了空白,如下所示:

LINE           MTH     %
------------------------
Line1            5    
Total Revenue   50    50
Line2           20    
Line3            4    
Line4           12    

这是我的 DAX:

MTH% = 
  SUMX(
      CALCULATETABLE(
         'vw_PandL',
         'vw_PandL'[Line]="TOTAL REVENUE"
          )
       ,
          [MTH]
  )

据我所知,我的表达方式与网页示例的唯一区别是网页使用 separate 维度来过滤行,而 may 表达式使用 same table 中的列来过滤行

网页上给出的例子:

=SUMX( CALCULATETABLE(
        'InternetSales_USD', 
        'DateTime'[CalendarYear]=2006
     )  
 , [SalesAmount_USD])  

根据下面的评论,这应该可以,但对我不起作用

我现在也试过了:

CALCULATE(
    SUM([MTH]),
    FILTER(ALL('vw_PandL'),
        [Line]="TOTAL REVENUE")
        )

这让我得到了总收入所有行的总计,但忽略了报告过滤器。这更近了。

ALLEXCEPT 函数旨在取消过滤指定列以外的所有内容,但是当我尝试这样做时,我得到了相同的结果。它仍然没有注意到我的日期和网站过滤器:

CALCULATE(
    SUM([MTH]),
    FILTER(ALLEXCEPT('vw_PandL','vw_PandL'[DateKey],'vw_PandL'[DimSiteKey]),
        [Line]="TOTAL REVENUE")
        )

更新一:

我设法用一个简单的模型重现了这个

在很多事情中我没有提到的是 LINE 列由另一个名为 SortZZ

的列排序

@Foxan Ng 答案中提出的计算非常有效,但只要我对“行”列进行排序,它就会表现出我提到的行为:总收入数字仅出现在“总收入”行上

经过进一步调查:我什至不需要对其进行排序,我可以将 SortZZ 列放入列表中,它会破坏计算。

解决方案

最终的运行计算是:

Total Revenue = 
CALCULATE(
    SUM([MTH]),
    FILTER(
        ALLEXCEPT('vw_PandL','vw_DimPeriod'[Period],'DimSite'[Site]),
        'vw_PandL'[Line] = "Total Revenue")
)

诀窍在ALLEXCEPT

我的关系和切片器设置如下:

使用以下任何 ALLEXCEPT 表达式时,计算不符合我的切片器。也就是说,该数字是所有时间段和站点的行的总计:

  1. 其实指的是join keys table:

    ALLEXCEPT('vw_PandL','vw_PandL'[PeriodCode],'vw_PandL'[SiteKey])

  2. 指维度中的连接键:

    ALLEXCEPT('vw_PandL','vw_DimPeriod'[PeriodCode],'DimSite'[SiteKey])

让计算器支持我的切片器的唯一方法是使用我在切片器中实际使用的实际字段,换句话说,标签

ALLEXCEPT('vw_PandL','vw_DimPeriod'[Period],'DimSite'[SiteName])

要从中学到的关键是,这不仅仅是一个关系数据库,您可以在其中加入一个键,然后对标签进行过滤。这些功能中提到的列和table非常重要。

您提供的示例实际上有效,只是您应该将其创建为 Measure 而不是 Calculated ColumnMeasure 使用过滤器,而 Calculated Column 即使应用了过滤器也将保持不变。

创建一个名为 Total RevenueMeasure:

Total Revenue = 
SUMX(
    CALCULATETABLE(
        'vw_PandL',
        'vw_PandL'[Line] = "Total Revenue"
    ),
    [MTH]
)

创建另一个 Measure 名为 %:

% = VALUES(vw_PandL[MTH]) / [Total Revenue]

它会在应用过滤器的情况下工作。

2015 年:

2016 年:

根据数据集的性质,% Measure 可以修改如下,这样它就可以在没有过滤器的情况下工作:

% = SUM(vw_PandL[MTH]) / [Total Revenue]

结果:

希望对您有所帮助。


编辑:

我将 Total Revenue 更改为您提供的替代解决方案,它适用于排序列的情况:

Total Revenue = 
CALCULATE(
    SUM([MTH]),
    FILTER(
        ALLEXCEPT('vw_PandL', vw_PandL[DateKey]),
        [Line] = "Total Revenue"
    )
)

无过滤器:

已应用过滤器: