【问题标题】:X-Axis with Year and as well as Month Year for the near dates in the same graph同一图表中最近日期的 X 轴年份和月份年份
【发布时间】:2020-10-05 14:23:07
【问题描述】:

我有一个数据集,其中包含多年的月度值(按月和其他属性分组,因此每个月可以有多个记录,尽管我认为这对问题并不重要):

       month     val  ...   
1 2017-01-01 17.0700
2 2017-01-01 17.0700
3 2017-02-01  2.4432
.. .........   .....
4 2019-04-01 61.0800
5 2019-04-01 40.7200
6 2019-05-01 20.3600

我可以正确地在条形图中可视化每月数据(month 被识别为日期层次结构,在子层次结构中有YearMonth)每年/每月。

我遇到的问题是,由于数据跨越很长一段时间,图表很大,我希望能够将一年数据(例如 2017、2018)减少到每月平均值。 结果图表的 x 轴将是: avg 2017 - avg 2018 - jan.2019 - feb. 2019 ... 这个想法是能够从一年的月平均值向下钻取到月值,尽管我不知道这是否可能?

我设法通过以下措施获得了年月平均值:

year_monthly_avg =
            AVERAGEX (
                SUMMARIZE ( data, data[month] ),
                CALCULATE ( SUM ( data[val] )
            )   

我可以在单独的条形图中显示(轴中的年份)。

【问题讨论】:

    标签: powerbi dax


    【解决方案1】:

    想法是 - 为此,您需要从现有表格派生的另一个表格,其中包含将显示在图表上的 x 轴值。

    我从这样的数据开始:-

    表 1

    那么,让我们在这个 Table1 上生成轴列(Calculated Column):-

    AxisCol = 
           Var MaxYear = MAX((Table1[Date].[Year]))
           Var Required_Year = YEAR(Table1[Date])
           Var YearDiff = MaxYear - Required_Year
           Var output = IF(YearDiff = 0, FORMAT(FORMAT(Table1[Date], "MMM YY"),"string"), FORMAT(Required_Year, "@"))
           Return (output)
    

    这个AxisCol的数据类型是“Text”。

    在表1中生成月份年份列(计算列)

    Month Year = FORMAT(Table1[Date], "MMM YY") 
    Year = YEAR(Table1[Date]) 
    

    将这两列的数据类型也设置为“文本”。

    创建一个新表:-

    Axis_Table = DISTINCT(Table1[AxisCol]) 
    

    这已经创建了断开连接的表。

    现在,创建 Date_Col(计算列)以在 Axis_Table 中查找排序顺序。

    Date_col = 
            Var RequiredVal = VALUE(Axis_Table[AxisCol])
            Var Year_or_Month_year = IF(LEN(RequiredVal) = 4, "Year", "Month Year")
            Var year_split = VALUE("20" & RIGHT(Axis_Table[AxisCol],2))
            Var Month_split = (LEFT(Axis_Table[AxisCol],3))
            Var month_num = SWITCH(Month_split, "Jan", 1, "Feb", 2, "Mar", 3, "Apr"  
                   , 4, "May", 5, "Jun", 6, "Jul", 7, "Aug"  
                   , 8, "Sep", 9, "Oct", 10, "Nov", 11, "Dec"  
                   , 12)  
            Var myDate = if(Year_or_Month_year = "Year",DATE(RequiredVal,1,1),DATE(year_split, month_num,1))
            Return myDate
    

    现在,您可以在 Axis_Table 中创建排序顺序(计算列)

    Sort Order = DATEDIFF((Axis_Table[Date_col]),MAX(Axis_Table[Date_col]),MONTH)
    

    现在作为Measure的最终输出,

    ValueReq = 
                var required_axis_val = SELECTEDVALUE(Axis_Table[AxisCol])
                Var requiredaxis = LEN(required_axis_val)
                Var output1 = CALCULATE(AVERAGE(Table1[Value]), FILTER(Table1,Table1[Month Year] = required_axis_val))
                Var output2 = CALCULATE(AVERAGE(Table1[Value]),FILTER(Table1, Table1[Year] = required_axis_val))
                var out_req = IF(requiredaxis = 4, output2, output1)
                return out_req
    

    可以根据您的过滤器选择和您可能拥有的其他条件更改此度量。

    最终的视觉效果是这样的,

    使用工具提示中的排序顺序,然后按排序顺序对视觉对象内的轴进行排序。

    然后,您可以在 axis_col 上的表之间创建关系,以便切片器工作。

    然后您可以使用此条件格式区分轴 -

    conditional formatting = IF(LEN(SELECTEDVALUE(Axis_Table[AxisCol])) = 4,1,0) 
    

    如果您难以理解解决方案,请告诉我。

    如果你能得到它为你工作的答案,请接受它。

    【讨论】:

    • 我想要的度量是每月总数(以及前几年的月平均值),所以 度量 应该是这样的:ValueReq = ... Var output1 = CALCULATE(SUM(Table1[Value]); FILTER(Table1;Table[Month Year] = required_axis_val)) Var output2 = CALCULATE(SUM(Table1[Value])/12;FILTER(Table1; Table1[Year]= required_axis_val)) ...
    • 排序工作完美,我只是有一个问题,因为我不清楚如何确定一年是显示为月平均值还是完全显示?还有如何使用条件格式?
    • 为了更清楚,在AxisCol output 中,您使用 yeardiff 来确定它应该是“MMM YY”还是“YYYY”,但正如问题中所指定的那样,它会是可以在报表上有一个切片器,用户可以手动选择是否应将数据分组为一年(即过滤器在这种情况下将包含 2017 2018 2019 并勾选这些框或不作为output的条件
    • @julien 如果您正在寻找一个选项,例如在切片器中显示月平均值、年平均值,然后从中进行选择。那么这是不可能的。但是,该解决方案可以使用书签概念而不是通过 DAX 来实现。解决方案是将两个图表放在一起,并通过按钮单击基于书签操作隐藏一个。 blog.crossjoin.co.uk/2018/04/20/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多