BOSS:是这样的,能不能搞个柱形图,既展示近两年的数据,又展示当年所有月份的数据,要求年月在一个维度上?
实际业务中,比较成熟的企业会有相应的市场团队,根据以往的营业情况和当下的市场行情为当年制定合理的销售目标,但是也会有一些小企业没有相应的业务团队,那么这种情况下,需要如何制定销售目标么?
其实针对这种情况,可以将往年的历史数据和截至到当月的数据合并进行展示,这样可以参照往年的经验来评估今年的整体经营状况。
这是本期的数据,仅有两列,一列日期,一列销售数量。
将其导入到PowerBI,并且根据如下代码,添加日期表,建立模型关系。
Dim_DateI =GENERATE ( CALENDAR ( MIN ( 'Fact_Sales'[Date] ), MAX ( 'Fact_Sales'[Date] ) ), VAR DA = [Date] VAR YEAR = YEAR ( DA ) VAR QUARTER = FORMAT ( DA, "Q" ) VAR MONTE = FORMAT ( DA, "MM" ) VAR DAY = DAY ( DA ) VAR WEEKID = WEEKDAY ( DA, 2 ) RETURN ROW ( "Year", YEAR, "Quarter", QUARTER, "YearMonth", YEAR & "." & MONTE, "Day", DAY ))
要实现年月同轴展示,那么需要有一张展示使用的维度表,可以将年月合并在一列中,根据如下代码构建第二张日期表。
Dim_DateII =VAR YearDate = SELECTCOLUMNS ( ADDCOLUMNS ( VALUES ( Dim_DateI ), "Type", "Year" ), "Type", [Type], "Year", [Year], "Display", [Year], "YearMonth", [YearMonth], "Date", [Date] )VAR MonthDate = SELECTCOLUMNS ( ADDCOLUMNS ( VALUES ( Dim_DateI ), "Type", "Month" ), "Type", [Type], "Year", [Year], "Display", [YearMonth], "YearMonth", [YearMonth], "Date", [Date] )RETURN UNION ( YearDate, MonthDate )
这里需要注意一下,第二张日期表不需要和之前的表建立模型关系。
001.Quantity =SUM ( Fact_Sales[Quantity] )
002.CurrentDate =MAX ( 'Dim_DateI'[Date] )
003.CurrentYear =MAX ( 'Dim_DateI'[Year] )
PS:切片器的两个度量值,是为了截断时间和计算使用。
004.Dim_Type =MAX ( 'Dim_DateII'[Type] )
005.CurrentQuantity =VAR DimDate = VALUES ( Dim_DateII[Date] )VAR Result = CALCULATE ( [001.Quantity], FILTER ( ALL('Dim_DateI'), 'Dim_DateI'[Date] IN DimDate ) )RETURN Result
从结果上我们可以看到,已经将原本的销售数量,在新日期表下面关联起来了。
006.ResultQuantity =IF ( [004.Dim_Type] = "Year", IF ( MAX ( 'Dim_DateII'[Year] ) <= [003.CurrentYear] && MAX ( 'Dim_DateII'[Year] ) >= [003.CurrentYear] - 2, IF ( MAX ( 'Dim_DateII'[Year] ) < [003.CurrentYear], [005.CurrentQuantity], CALCULATE ( [005.CurrentQuantity], FILTER ( ALL ( Dim_DateII ), [Year] = [003.CurrentYear] && [Date] <= [002.CurrentDate] ) ) ) ), IF ( MAX ( 'Dim_DateII'[Date] ) <= [002.CurrentDate] && MAX ( 'Dim_DateII'[Year] ) = [003.CurrentYear], [005.CurrentQuantity], BLANK () ))
2.如何将新表和原本模型关系中的日期表关联起来,是问题的核心点,可以使用TREATAS函数,也可以使用IN或者INTERSECT函数,方式不唯一;