我有下表:
产品 | 地区 | 代表 | 月 |
---|---|---|---|
REG-YH-67 | 北 | 简 | 六月 |
REG-YH-67 | 北 | 简 | 三月 |
REG-YH-67 | 北 | 简 | 十二月 |
REG-YH-89 | 北 | 简 | 九月 |
REG-YH-67 | 超出规定 | 简 | 六月 |
REG-YH-9 | 北 | 简 | 三月 |
REG-YH-9 | 西 | 亚历克斯 | 十二月 |
REG-YH-9 | 西 | 亚历克斯 | 九月 |
REG-YH-30 | 西 | 将会 | 六月 |
REG-YH-33 | 西 | 将会 | 三月 |
REG-YH-33 | 超出规定 | 将会 | 十二月 |
REG-YH-33 | 西 | 将会 | 九月 |
REG-YH-33 | 西 | 玛莎 | 六月 |
REG-YH-33 | 西 | 玛莎 | 三月 |
REG-YH-67 | 超出规定 | 简 | 十二月 |
REG-YH-67 | 超出规定 | 简 | 九月 |
REG-YH-9 | 北 | 简 | 六月 |
REG-YH-89 | 北 | 简 | 三月 |
REG-YH-9 | 北 | 简 | 十二月 |
REG-YH-9 | 西 | 简 | 九月 |
REG-YH-9 | 超出规定 | 简 | 六月 |
REG-YH-9 | 北 | 简 | 三月 |
REG-YH-67 | 超出规定 | 简 | 十二月 |
REG-YH-9 | 北 | 简 | 九月 |
REG-YH-67 | 超出规定 | 简 | 六月 |
REG-YH-9 | 超出规定 | 简 | 三月 |
这是我在要创建的 Power Bi 文档中使用的源文件,我的主页中有 2 个全局过滤器,分别是
REP
和 MONTH
,我想学习如何使用 DAX 来创建一个汇总表,其中列出了每个 PRODUCTs
的前 3 个最畅销
REGION
如果我们不使用过滤器,那么所需的表格将如下所示:
地区 | 最畅销 | 第二畅销 | 第三畅销 |
---|---|---|---|
北 | REG-YH-9 | REG-YH-67 | REG-YH-89 |
超出规定 | REG-YH-67 | REG-YH-9 | REG-YH-33 |
西 | REG-YH-33 | REG-YH-9 | REG-YH-30 |
但我希望能够在 PBI 仪表板中使用我的全局过滤器,也许可以按
REP
= MARTHA & JANE 进行过滤,以便我的汇总表重新计算/变为:
地区 | 最畅销 | 第二畅销 | 第三畅销 |
---|---|---|---|
北 | REG-YH-9 | REG-YH-67 | REG-YH-89 |
超出规定 | REG-YH-67 | REG-YH-9 | 空 |
西 | REG-YH-33 | REG-YH-9 | 空 |
有没有办法在 Power BI 上执行此操作?
创建 3 个度量,将排名更改为 1,2 或 3
Measure =
VAR tbl =
ADDCOLUMNS(
'table'
,"@rank",RANKX(VALUES('table'[PRODUCT]),CALCULATE( COUNT('table'[PRODUCT]), ALLEXCEPT('table','table'[PRODUCT],'table'[REGION])), , ,Dense)
)
VAR temp = SELECTCOLUMNS( FILTER(tbl, [@rank] = 1),"a", 'table'[PRODUCT])
VAR result = CALCULATE(MAX('table'[PRODUCT]),'table'[PRODUCT] IN temp)
RETURN result
如果这很重要,下面的解决方案会考虑行总数。
Measure1 =
VAR tbl1 =
ADDCOLUMNS(
'table'
,"@rank",RANKX(VALUES('table'[PRODUCT]),CALCULATE( COUNT('table'[PRODUCT]), ALLEXCEPT('table','table'[PRODUCT],'table'[REGION])), , ,Dense)
)
VAR temp1 = SELECTCOLUMNS( FILTER(tbl1, [@rank] = 1),"a", 'table'[PRODUCT])
VAR result1 = CALCULATE(MAX('table'[PRODUCT]),'table'[PRODUCT] IN temp1)
VAR tbl2 =
ADDCOLUMNS(
'table'
,"@rank",RANKX(VALUES('table'[PRODUCT]),CALCULATE( COUNT('table'[PRODUCT]), ALLEXCEPT('table','table'[PRODUCT])), , ,Dense)
)
VAR temp2 = SELECTCOLUMNS( FILTER(tbl2, [@rank] = 1),"a", 'table'[PRODUCT])
VAR result2 = CALCULATE(MAX('table'[PRODUCT]),'table'[PRODUCT] IN temp2)
RETURN IF(ISFILTERED('table'[REGION]), result1, result2)
这个怎么样,罗恩·罗森菲尔德? )
这是一个逐步的措施。因此,很容易了解并了解它是如何工作的。您需要 3 个相等的度量,但不要忘记更改 TOP2 和 TOP3 的名称和 TopPos 值。
TOP1 =
VAR TopPos = 1
VAR currentRegion = SELECTEDVALUE('table'[REGION])
-- VAR currentRegion = VALUES('table'[REGION]) -- if you want to have a value in total
VAR tblCount =
ADDCOLUMNS(
SUMMARIZE('table','table'[PRODUCT],'table'[REGION])
,"Count",CALCULATE(CountRows('table'))*1000000
)
VAR tblCountIndex =
ADDCOLUMNS(
tblCount
,"NameIndex",RANKX(VALUES('table'[PRODUCT]),[PRODUCT])
)
VAR filteredByRegion =
FILTER(
tblCountIndex
,[REGION]=currentRegion
--, [REGION] IN currentRegion --for value in total
)
VAR tblRanked=
ADDCOLUMNS(
filteredByRegion
,"Rank",RANKX(filteredByRegion,[Count] + [NameIndex])
)
VAR TopProduct=
SELECTCOLUMNS(
FILTER(
tblRanked
,[Rank]=TopPos
)
,[PRODUCT]
)
VAR RESULT =
CALCULATE(
SELECTEDVALUE('table'[PRODUCT])
,'table'[PRODUCT] = TopProduct
)
RETURN
RESULT
...
TOP2 =
VAR TopPos = 2
...
TOP3 =
VAR TopPos = 3