列表报告,每行显示一个特定行的百分比
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
我的关系和切片器设置如下:
vw_PandL
是事实table
vw_DimPeriod
在 PeriodCode
加入了它
DimSite
也在 SiteKey
上加入了它
使用以下任何 ALLEXCEPT
表达式时,计算不符合我的切片器。也就是说,该数字是所有时间段和站点的行的总计:
其实指的是join keys table:
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])
要从中学到的关键是,这不仅仅是一个关系数据库,您可以在其中加入一个键,然后对标签进行过滤。这些功能中提到的列和table非常重要。
您提供的示例实际上有效,只是您应该将其创建为 Measure
而不是 Calculated Column
。 Measure
使用过滤器,而 Calculated Column
即使应用了过滤器也将保持不变。
创建一个名为 Total Revenue
的 Measure
:
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"
)
)
无过滤器:
已应用过滤器:
我有一个包含多行的 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
我的关系和切片器设置如下:
vw_PandL
是事实tablevw_DimPeriod
在PeriodCode
加入了它
DimSite
也在SiteKey
上加入了它
使用以下任何 ALLEXCEPT
表达式时,计算不符合我的切片器。也就是说,该数字是所有时间段和站点的行的总计:
其实指的是join keys table:
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])
要从中学到的关键是,这不仅仅是一个关系数据库,您可以在其中加入一个键,然后对标签进行过滤。这些功能中提到的列和table非常重要。
您提供的示例实际上有效,只是您应该将其创建为 Measure
而不是 Calculated Column
。 Measure
使用过滤器,而 Calculated Column
即使应用了过滤器也将保持不变。
创建一个名为 Total Revenue
的 Measure
:
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"
)
)
无过滤器:
已应用过滤器: