Introduction
In the previous post I exemplified various operations that can be performed with visual calculations on simple tables based on square numbers. Changing the simple table to a matrix table doesn't bring any benefit. The real benefit comes when one restructures the table to store only a cell per row in a table.
Data Modelling
For this the Magic5 table can be transformed via the following code, which creates a second table (e.g. M5):
M5 = UNION ( SUMMARIZECOLUMNS( Magic5[Id] , Magic5[R] , Magic5[Index] , Magic5[C1] , "Col", "C1" ) , SUMMARIZECOLUMNS( Magic5[Id] , Magic5[R] , Magic5[Index] , Magic5[C2] , "Col", "C2" ) , SUMMARIZECOLUMNS( Magic5[Id] , Magic5[R] , Magic5[Index] , Magic5[C3] , "Col", "C3" ) , SUMMARIZECOLUMNS( Magic5[Id] , Magic5[R] , Magic5[Index] , Magic5[C4] , "Col", "C4" ) , SUMMARIZECOLUMNS( Magic5[Id] , Magic5[R] , Magic5[Index] , Magic5[C5] , "Col", "C5" ) )
Once this done, one can add the column [Col] as values for the matrix in a new visual. From now on, all the calculations can be done on copies of this visual.
Simple Operations
The behavior of the RUNNINGSUM and other functions is different when applied on a matrix table because the formula is applied to every cell of the N*N table, a column with the result being added for each existing column of the matrix.
Moreover, there are four different ways of applying the formula based on the Axis used. ROW calculates the formula by the row within a column:
Run SumByRow(C) = RUNNINGSUM([C], ROWS)
R | C | Run Sum(C) | C | Run Sum(C) | C | Run Sum(C) | C | Run Sum(C) | C | Run Sum(C) |
R1 | 18 | 18 | 25 | 25 | 2 | 2 | 9 | 9 | 11 | 11 |
R2 | 4 | 22 | 6 | 31 | 13 | 15 | 20 | 29 | 22 | 33 |
R3 | 15 | 37 | 17 | 48 | 24 | 39 | 1 | 30 | 8 | 41 |
R4 | 21 | 58 | 3 | 51 | 10 | 49 | 12 | 42 | 19 | 60 |
R5 | 7 | 65 | 14 | 65 | 16 | 65 | 23 | 65 | 5 | 65 |
By providing COLUMNS as parameter for the Axis makes the calculation run by the column within a row:
Run SumByCol(C) = RUNNINGSUM([C], COLUMNS)
R | C | Run Sum(C) | C | Run Sum(C) | C | Run Sum(C) | C | Run Sum(C) | C | Run Sum(C) |
R1 | 18 | 18 | 25 | 43 | 2 | 45 | 9 | 54 | 11 | 65 |
R2 | 4 | 4 | 6 | 10 | 13 | 23 | 20 | 43 | 22 | 65 |
R3 | 15 | 15 | 17 | 32 | 24 | 56 | 1 | 57 | 8 | 65 |
R4 | 21 | 21 | 3 | 24 | 10 | 34 | 12 | 46 | 19 | 65 |
R5 | 7 | 7 | 14 | 21 | 16 | 37 | 23 | 60 | 5 | 65 |
Run SumByRow-Col(C) = RUNNINGSUM([C],ROWS COLUMNS)
R | C | Run Sum(C) | C | Run Sum(C) | C | Run Sum(C) | C | Run Sum(C) | C | Run Sum(C) |
R1 | 18 | 18 | 25 | 90 | 2 | 132 | 9 | 204 | 11 | 271 |
R2 | 4 | 22 | 6 | 96 | 13 | 145 | 20 | 224 | 22 | 293 |
R3 | 15 | 37 | 17 | 113 | 24 | 169 | 1 | 225 | 8 | 301 |
R4 | 21 | 58 | 3 | 116 | 10 | 179 | 12 | 237 | 19 | 320 |
R5 | 7 | 65 | 14 | 130 | 16 | 195 | 23 | 260 | 5 | 325 |
Run SumByCol-Row = RUNNINGSUM([C],COLUMNS ROWS)
R | C | Run Sum(C) | C | Run Sum(C) | C | Run Sum(C) | C | Run Sum(C) | C | Run Sum(C) |
R1 | 18 | 18 | 25 | 43 | 2 | 45 | 9 | 54 | 11 | 65 |
R2 | 4 | 69 | 6 | 75 | 13 | 88 | 20 | 108 | 22 | 130 |
R3 | 15 | 145 | 17 | 162 | 24 | 186 | 1 | 187 | 8 | 195 |
R4 | 21 | 216 | 3 | 219 | 10 | 229 | 12 | 241 | 19 | 260 |
R5 | 7 | 267 | 14 | 281 | 16 | 297 | 23 | 320 | 5 | 325 |
RankByRow = RANK(DENSE,ROWS) -- ranking by row independent of values RankByRow ASC = RANK(DENSE,ROWS, ORDERBY([C],ASC)) -- ranking by row ascending RankByRow DESC = RANK(DENSE,ROWS, ORDERBY([C], DESC)) -- ranking by row descending RankByRow-Col ASC = RANK(DENSE,ROWS COLUMNS, ORDERBY([C],ASC)) -- ranking by row columns ascending RankByRow-Col DESC = RANK(DENSE,ROWS COLUMNS, ORDERBY([C], DESC)) -- ranking by row columns ascending
DiffToPrevByRow = [C] - PREVIOUS([C]) -- difference to previous record DiffToPrevByRow* = IF(NOT(IsBlank(PREVIOUS([C]))), [C] - PREVIOUS([C])) -- extended difference to previous record DiffToPrevByRow-Col = [C] - PREVIOUS([C],, ROWS COLUMNS) -- difference to previous record by ROWS COLUMNS DiffToFirstByRow = [C] - FIRST([C]) -- difference to first record DiffToPrevByCol = [C] - FIRST([C], COLUMNS) -- difference to previous record COLUMNS Ranking = RANK(DENSE, ROWS COLUMNS, ORDERBY([C], ASC)) -- ranking of values by ROWS COLUMNS OffsetDiffToPrevByRow = [C] - calculate([C], OFFSET(1, ROWS, ORDERBY([Ranking],DESC))) -- difference to the previous record by ROW OffsetDiffToPrevByRow-Col = [C] - calculate([C], OFFSET(1, ROWS COLUMNS, ORDERBY([Ranking],DESC))) -- difference to the previous record by ROW
Previous Post <<||>> Next Post
References:
[1] Microsoft Learn (2024) Power BI: Using visual calculations [preview] (link)