首页 文章

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

提问于
浏览
0

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

它是从SQL中的视图填充的

其中一条线是“总收入”

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

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

请注意 MTH 并没有达到总收入,所以我不能只拿总数,我需要把名为Total Revenue的行作为分母

这是我在这里尝试做的完美例子:

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

据我所知,我的表达式和网页上的示例之间的唯一区别是,网页使用单独的维度来过滤行,而may表达式使用同一个表中的列来过滤行

在网页上给出的示例:

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

基于下面的评论,这应该有效,但它对我不起作用

我现在也尝试过:

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

这使我获得了TOTAL REVENUE所有行的总计,但忽略了报告过滤器 . 这更接近了 .

ALLEXCEPT 函数用于取消除指定列之外的所有内容,但是当我尝试这个时,我得到相同的结果 . 它仍然没有记下我的日期和网站过滤器:

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

Update 1:

我设法在一个简单的模型中重现这一点

我没有提到的很多事情是 LINE 列被另一个名为 SortZZ 的列排序

在@Foxan Ng答案中提出的计算工作完美但但是一旦我对Line列进行排序,它就会显示我提到的行为:Total Revenue数字仅显示在Total Revenue行上

经过进一步调查:我甚至不需要对它进行排序,我可以将SortZZ列放在列表中,它会破坏计算结果 .

Solution

最终运作的计算方法是:

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

诀窍在 ALLEXCEPT

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

  • vw_PandL 是一个事实表

  • vw_DimPeriod 已加入 PeriodCode

  • DimSite 也加入 SiteKey

使用以下任何 ALLEXCEPT 表达式时,计算不符合我的切片器 . 也就是说,该数字是所有时期和地点的线路总数:

  • 参考事实表中的连接键:

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

  • 参考尺寸中的连接键:

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

我可以获得钙片来兑现我的切片器的唯一方法是使用我在切片机中实际使用的实际字段,换句话说就是标签

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

从中学习的关键是,这不仅仅是一个关系数据库,您可以在其中加入密钥,然后对标签进行过滤即可 . 这些函数中提到的列和表非常重要 .

1 回答

  • 0

    您提供的示例实际上有效,但您应将其创建为 Measure 而不是 Calculated Column . Measure 适用于过滤器,而 Calculated Column 即使应用了过滤器也会保持不变 .

    创建名为 Total RevenueMeasure

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

    创建另一个名为 %Measure

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

    它将适用于应用的过滤器 .

    2015年:
    2015

    2016年:
    2016

    取决于数据集的性质, % Measure 可以修改如下,因此它可以在没有过滤器的情况下工作:

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

    结果:
    Total

    希望能帮助到你 .


    编辑:

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

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

    没有过滤器:
    sorted, no filter

    已应用过滤器:
    sorted, filter applied

相关问题