BI技巧丨子类Top及其他_sql

BOSS:白茶,能不能在展示产品销量的时候,前三的展示,其他的都归为“其他”啊?
白茶:可以啊!安排!

在实际项目中,一张Dashboard看板的设计,既要考虑逻辑的准确无误,也需要考虑用户的使用体验,更多的,是需要我们带有一点产品人性化的理念去设计看板。

日常汇报中,留给用户阐述的时间可能并不充裕,这就要求用户在使用看板时,可以快速准确地描述出问题给上层领导,这种思路,其实就是**“帕累托二八定律”**在工作中的应用。

案例数据:

BI技巧丨子类Top及其他_PowerBI_02

BI技巧丨子类Top及其他_看板_03

BI技巧丨子类Top及其他_数据_04

这是本期的案例数据,共计三张表,一张产品表,一张分店表,一张事实表。

我们需要解决的问题就是:

当产品销量排名符合我们设定的阈值逻辑时,则正常展示销量,否则将超过阈值的数据,统一汇总为“其他”。

要实现这个问题,我们还需要额外添加一张表。

BI技巧丨子类Top及其他_sql_05

这是我们重新构建的一张产品维度表,可以看到,每个产品组的下面,我们都添加了“其他”这一分类。

PS:
小伙伴们可以通过其他方式构建此表,方法不唯一。

将上述的四张表,导入到PowerBI中,模型关系如下:

BI技巧丨子类Top及其他_看板_06

为了能够更加灵活展示Top,我们继续添加一张参数表。

BI技巧丨子类Top及其他_数据_07

到这里,我们的准备工作结束。

基础指标:

销售数量:

001.Quantity = 
SUM ( 'Fact_Sales'[Quantity] )

切换上下文的销售数量:

002.CurrentValue = 
VAR CurrentProduct =
    VALUES ( 'Dim_ProductII'[ProductName] )
VAR CurrentValue =
    CALCULATE (
        [001.Quantity],
        FILTER ( 'Dim_Product', 'Dim_Product'[ProductName] IN CurrentProduct )
    )
RETURN
    CurrentValue

这一步的目的,是为了将原本在产品表展示的销量,可以在第二张产品表进行展示,结果如下:

BI技巧丨子类Top及其他_sql_08

那么如何展示Top和其他呢?我们先要有一个排名的度量值。

销量排名:

003.CurrentQuantityRankx = 
IF (
    HASONEFILTER ( 'Dim_ProductII'[ProductName] ),
    RANKX ( ALLSELECTED ( 'Dim_ProductII'[ProductName] ), [002.CurrentValue] )
)

结果如下:

BI技巧丨子类Top及其他_数据库_09

有了排名之后,我们就可以实现动态展示Top和其他了。

004.TopOther = 
VAR CurrentProduct =
    SELECTEDVALUE ( 'Dim_ProductII'[ProductName] )
VAR Result =
    IF (
        CurrentProduct <> "其他",
        IF (
            [003.CurrentQuantityRankx] <= [Dim_Top Value],
            [002.CurrentValue],
            BLANK ()
        ),
        CALCULATE (
            [002.CurrentValue],
            FILTER (
                ALLSELECTED ( 'Dim_ProductII'[ProductName] ),
                'DAX'[003.CurrentQuantityRankx] > [Dim_Top Value]
            )
        )
    )
RETURN
    Result

最终展示效果如下:

BI技巧丨子类Top及其他_数据_10

BI技巧丨子类Top及其他_数据库_11

BI技巧丨子类Top及其他_sql_12

这里是白茶,一个PowerBI的初学者。

BI技巧丨子类Top及其他_看板_13