达克斯(Dax)自定义52/53周日期表的上周销售额总和

时间:2019-09-08 10:30:19

标签: powerbi dax ssas-tabular

我正在尝试创建一种度量来计算上周的销售额之和。我的日历是自定义的,并保存在日期表中(从2月开始),可以是52周或53周。

下面的代码来自这个方便的youtube教程(https://www.youtube.com/watch?v=jclWnA7pEvY),但是如果我不在52周的一年里,我将无法解决如何适应第一周的一切。

在下面的代码中,[Week_WOY]是1到53之间的数字,[Year_Uid]是年份-例如2015、2016等。

我要在VS中创建表格模型,然后在部署后以实时查询模式使用PowerBI进行访问。令人讨厌的是,这意味着我不能使用某些DAX表达式(例如SELECTEDVALUE)。

逻辑上,我想我想: a)确定当前星期是否为第1周 b)查找上一年的周数 c)返回该(b)周号的销售总额

这是我目前的代码:

users
|-- userid1
|   |-- chats
|   |   |-- chatId1 : userid2
|   |   |-- chatId2 : userid3
|   |-- name : user title
|   |-- number : user phone number
|
|-- userid2
|   |-- chats
|   |   |-- chatId1 : userid1
|   |   |-- chatId3 : userid3
|   |-- name : user title
|   |-- number : user phone number



chat
|-- chatid1
|   |-- messageid1
|   |   |-- createAt : creation time
|   |   |-- message : message
|   |   |-- senderID : id of the sender
|   |
|   |-- messageid1
|   |   |-- createAt : creation time
|   |   |-- message : message
|   |   |-- senderID : id of the sender
|
|-- chatid2
|   |-- messageid1
|   |   |-- createAt : creation time
|   |   |-- message : message
|   |   |-- senderID : id of the sender

1 个答案:

答案 0 :(得分:0)

最好的解决方案是在日期表中添加一列。那一列就是我所说的WeekIndex。这是一个每周增加1的值。我没有设置52/53周日期暗淡的设置,但是您可以在my DimDate中看到此类列的示例。使用这样的列,您可以编写如下的度量:

Sales = SUM ( 'Sales'[Sales - Inc VAT £] )
Sales Prior Week =
VAR PriorWeek = MAX ( 'Date'[WeekIndex] ) - 1
RETURN
  CALCULATE (
    [Sales],
    ALL ( 'Date' ),
    'Date'[WeekIndex] = PriorWeek
  )

如果已经具有日期维度,则通常很容易得出[WeekIndex]。通常,最简单的方法是在少于当前周的情况下进行不同的Year-Week对计数。

否则,如果您出于某种原因想要避免增强模型,则:

Sales Prior Week =
VAR CurrentWeek = MAX ( 'Date'[Week_WOY] )
VAR CurrentYear = MAX ( 'Date'[Year_Uid] )
VAR PriorYear = IF ( CurrentWeek = 1, CurrentYear - 1, CurrentYear )
VAR PriorWeek =
  IF (
    CurrentWeek = 1,
    CALCULATE (
      MAX ( 'Date'[Week_WOY] ),
      ALL ( 'Date' ),
      'Date'[Year_Uid] = PriorYear
    ),
    CurrentWeek - 1
  )
RETURN
  CALCULATE (
    [Sales],
    ALL ( 'Date' ),
    'Date'[Year_Uid] = PriorYear,
    'Date'[Week_WOY] = PriorWeek
  )

通常,我喜欢使用MAX而不是SELECTEDVALUEIF ( HASONEVALUE, ...)来获取当前值来实现时间智能。这与实现内置时间智能功能的方式保持一致。

此外,SELECTEDVALUE在Tabular的更高版本中。如果您因缺少它而感到痛苦,则应该推动升级。