使用 DAX 创建 COUNTS 汇总表,允许进行全局过滤器

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

我有下表:

产品 地区 代表
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 上执行此操作?

powerbi dax powerquery data-analysis powerbi-desktop
2个回答
3
投票

创建 3 个度量,将排名更改为 1,2 或 3

enter image description here enter image description here

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)

enter image description here


2
投票

这个怎么样,罗恩·罗森菲尔德? )

这是一个逐步的措施。因此,很容易了解并了解它是如何工作的。您需要 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 

enter image description here

enter image description here

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