I have a report requirement and I am using PBI to visualize. The layout required is very similar to the Matrix visual. I am trying to report on Measure (SCADA Volume) by date on the columns. I want some additional measures to print ONLY FOR THE GRAND TOTAL, after all of the dates.
When I add these Measures to the Matrix Values, the measures are printed for every date. How can I apply formatting that will show those Measures only in the Grand Totals?
The "asymetrical columns" solution recommended (by David) was the answer. The solution is to create a Calculation Group with defined calculation for each individual column needed in the matrix.
My case required dynamic reference to trailing dates; That also required some calc columns on the 'Calendar' table to find the correct dates.
Building a Matrix with Asymmetrical Columns and Rows in Power BI - Excelerator BI
(127) REDUCE the # of measures with Calculation Groups In Power BI - YouTube
Calculation Items
{
"InstanceID": "bae2764b-a0be-4411-82e1-d5c723ec9918",
"calculationitems": [
{
"name": "Wk 1: Sun",
"expression": "CALCULATE (\n SELECTEDMEASURE (),\n ALL ( 'Calendar' ),\n 'Calendar'[WeekDayOffset_Id] = 11\n)",
"ordinal": 8,
"modifiedTime": "2022-06-08T13:44:04.866667",
"formatStringDefinition": {
"expression": "\"#,0\"",
"modifiedTime": "2022-06-08T03:33:39.253333"
}
},
{
"name": "Wk 1: Mon",
"expression": "CALCULATE (\n SELECTEDMEASURE (),\n ALL ( 'Calendar' ),\n 'Calendar'[WeekDayOffset_Id] = 12\n)",
"ordinal": 9,
"modifiedTime": "2022-06-08T13:44:04.866667",
"formatStringDefinition": {
"expression": "\"#,0\"",
"modifiedTime": "2022-06-08T03:33:39.253333"
}
},
{
"name": "Wk 1: Tues",
"expression": "CALCULATE (\n SELECTEDMEASURE (),\n ALL ( 'Calendar' ),\n 'Calendar'[WeekDayOffset_Id] = 13\n)",
"ordinal": 10,
"modifiedTime": "2022-06-08T13:44:04.866667",
"formatStringDefinition": {
"expression": "\"#,0\"",
"modifiedTime": "2022-06-08T03:33:39.253333"
}
},
{
"name": "Wk 1: Wed",
"expression": "CALCULATE (\n SELECTEDMEASURE (),\n ALL ( 'Calendar' ),\n 'Calendar'[WeekDayOffset_Id] = 14\n)",
"ordinal": 11,
"modifiedTime": "2022-06-08T13:44:04.866667",
"formatStringDefinition": {
"expression": "\"#,0\"",
"modifiedTime": "2022-06-08T03:33:39.253333"
}
},
{
"name": "Wk 1: Thu",
"expression": "CALCULATE (\n SELECTEDMEASURE (),\n ALL ( 'Calendar' ),\n 'Calendar'[WeekDayOffset_Id] = 15\n)",
"ordinal": 12,
"modifiedTime": "2022-06-08T13:44:04.866667",
"formatStringDefinition": {
"expression": "\"#,0\"",
"modifiedTime": "2022-06-08T03:33:39.253333"
}
},
{
"name": "Wk 1: Fri",
"expression": "CALCULATE (\n SELECTEDMEASURE (),\n ALL ( 'Calendar' ),\n 'Calendar'[WeekDayOffset_Id] = 16\n)",
"ordinal": 13,
"modifiedTime": "2022-06-08T13:44:04.866667",
"formatStringDefinition": {
"expression": "\"#,0\"",
"modifiedTime": "2022-06-08T03:33:39.253333"
}
},
{
"name": "Wk 1: Sat",
"expression": "CALCULATE (\n SELECTEDMEASURE (),\n ALL ( 'Calendar' ),\n 'Calendar'[WeekDayOffset_Id] = 17\n)",
"ordinal": 14,
"modifiedTime": "2022-06-08T13:44:04.866667",
"formatStringDefinition": {
"expression": "\"#,0\"",
"modifiedTime": "2022-06-08T03:33:39.253333"
}
},
{
"name": "TOTAL Wk1",
"expression": "CALCULATE (\n SELECTEDMEASURE (),\n ALL ( 'Calendar' ),\n 'Calendar'[Weeks Back Offset] = 1\n)",
"ordinal": 15,
"modifiedTime": "2022-06-08T13:44:54.063333",
"formatStringDefinition": {
"expression": "\"#,0\"",
"modifiedTime": "2022-06-08T03:33:39.253333"
}
},
{
"name": "TOTAL: 2 wks",
"expression": "CALCULATE (\n SELECTEDMEASURE (),\n ALL ( 'Calendar' ),\n 'Calendar'[Weeks Back Offset] >= 1\n && 'Calendar'[Weeks Back Offset] <= 2\n)",
"ordinal": 16,
"modifiedTime": "2022-06-08T13:44:04.866667"
},
{
"name": "7-day Avg",
"expression": "VAR Vol_7dRolling =\n CALCULATE (\n SELECTEDMEASURE (),\n DATESINPERIOD ( 'Calendar'[Date], MAX ( 'Calendar'[Date] ), -7, DAY )\n )\nVAR Avg7d =\n DIVIDE ( Vol_7dRolling, 7 )\nRETURN\n Avg7d",
"ordinal": 17,
"modifiedTime": "2022-06-08T13:44:04.866667",
"formatStringDefinition": {
"expression": "\"#,0\"",
"modifiedTime": "2022-06-08T03:33:39.253333"
}
},
{
"name": "PW Avg",
"expression": "VAR Vol_PW =\n CALCULATE (\n SELECTEDMEASURE (),\n FILTER ( 'Calendar', 'Calendar'[Weeks Back Offset] = 2 )\n )\nVAR Avg7dPW =\n DIVIDE ( Vol_PW, 7 )\nRETURN\n Avg7dPW",
"ordinal": 18,
"modifiedTime": "2022-06-08T21:56:11.783333",
"formatStringDefinition": {
"expression": "\"#,0\"",
"modifiedTime": "2022-06-08T03:33:39.253333"
}
},
{
"name": "% Δ PW",
"expression": "VAR Vol_7dRolling =\n CALCULATE (\n SELECTEDMEASURE (),\n DATESINPERIOD ( 'Calendar'[Date], MAX ( 'Calendar'[Date] ), -7, DAY )\n )\nVAR Avg7d =\n DIVIDE ( Vol_7dRolling, 7 ) \n// Prior Week\nVAR Vol_PW =\n CALCULATE (\n SELECTEDMEASURE (),\n FILTER ( 'Calendar', 'Calendar'[Weeks Back Offset] = 2 )\n )\nVAR Avg7dPW =\n DIVIDE ( Vol_PW, 7 ) \n// Compare \nVAR ChangeDailyAvg = \n ( Avg7d - Avg7dPW )\nVAR PctChangeDailyAvg = \n DIVIDE(ChangeDailyAvg, Avg7d )\nRETURN\n PctChangeDailyAvg",
"ordinal": 19,
"modifiedTime": "2022-06-08T22:03:06.576667",
"formatStringDefinition": {
"expression": "\"#,0.0%;-#,0.0%;#,0.0%\"",
"modifiedTime": "2022-06-08T03:33:39.253333"
}
},
{
"name": "* Week Roll",
"description": "These are temp columns used for validation. BLANK() return value will exclude this calculated item",
"expression": "VAR Vol_7dRolling =\n CALCULATE (\n SELECTEDMEASURE (),\n DATESINPERIOD ( 'Calendar'[Date], MAX ( 'Calendar'[Date] ), -7, DAY )\n )\nVAR Avg7d =\n DIVIDE ( Vol_7dRolling, 7 )\nRETURN\n // Vol_7dRolling\n BLANK()",
"ordinal": 20,
"modifiedTime": "2022-06-08T22:05:29.33"
},
{
"name": "* PW Roll",
"description": "These are temp columns used for validation. BLANK() return value will exclude this calculated item",
"expression": "VAR Vol_PW =\n CALCULATE (\n SELECTEDMEASURE (),\n FILTER ( 'Calendar', 'Calendar'[Weeks Back Offset] = 2 )\n )\nVAR Avg7dPW =\n DIVIDE ( Vol_PW, 7 )\nRETURN\n // Vol_PW\n BLANK()",
"ordinal": 21,
"modifiedTime": "2022-06-08T22:05:29.33"
}
]
}
'Calendar' table field calculations
Calendar =
ADDCOLUMNS (
CALENDARAUTO (),
"DateKey", FORMAT([Date], "YYYY") & FORMAT([Date], "MM") & FORMAT([Date], "DD")
, "Year", YEAR([Date])
, "Mo", MONTH([Date])
, "day", DAY([Date])
, "DayName (short)", FORMAT([Date],"ddd")
, "DayNum", WEEKDAY([Date])
, "Weeknum", WEEKNUM([Date],1)
, "Mo Name", FORMAT([Date], "MMM")
, "Mo-Yr", FORMAT([Date], "MMM") &"-"& FORMAT([Date],"YY")
, "Mo_startDate", EOMONTH([Date],-1) + 1
, "Yr_startDate", DATE(YEAR([Date]),1,1)
, "Qtr", QUARTER([Date])
, "Qtr Name", "Qtr " & FORMAT([Date], "Q")
, "Yr Name", "YR " & FORMAT([Date], "YYYY")
, "Mo_endDate", EOMONTH([Date],0)
, "SortDesc_YrMo", - DATEDIFF(date(9999, 12, 31), EOMONTH([Date],-1)+1, MONTH)
, "SortDesc_Date", - DATEDIFF(date(9999, 12, 31), [Date], DAY)
, "Date (DESC)", [Date]
, "Mo-Yr (DESC)", FORMAT([Date], "MMM") &"-"& FORMAT([Date],"YY")
, "Days Offset", DATEDIFF(TODAY(),[Date],DAY)
, "Months Offset", DATEDIFF(TODAY(),[Date],MONTH)
, "Years Offset", DATEDIFF(TODAY(),[Date],YEAR)
, "Weeks Offset", DATEDIFF(TODAY(),[Date],WEEK)
, "Weeks Back Offset", DATEDIFF(TODAY(),[Date],WEEK) * -1
-- WEEK LOOKBACK - Format printed on report lables = "Wk 2: Mon"
, "Lookback Day Name", "Wk " & DATEDIFF(TODAY(),[Date],WEEK) * -1 & ": " & FORMAT([Date],"ddd")
-- WEEK LOOKBACK - Concatanate [Weeksback + Daynum] to find the relative date location = "1" weeksback & "1" day = "11" to number = 11..17 and 21..27
, "WeekDayOffset_Id", CONVERT( CONVERT(DATEDIFF(TODAY(),[Date],WEEK) * -1, STRING) & CONVERT(WEEKDAY([Date]), STRING), DOUBLE)
-- WEEK LOOKBACK - Sort the [Lookback Day Name], chronological oldest to newest date
, "WeekDayOffset_Sort", CONVERT( CONVERT(DATEDIFF(TODAY(),[Date],WEEK), STRING) & CONVERT(WEEKDAY([Date]), STRING), DOUBLE)
)
You need to create what's known as an asymmetric matrix. It is quite an involved process and requires the use of a disconnected table. It is probably a bit much to describe the whole technique here so instead you can follow the guide on this link: https://exceleratorbi.com.au/building-a-matrix-with-asymmetrical-columns-and-rows-in-power-bi/