Appendix A — Quick Reference: Excel, SQL, and DAX
This appendix gathers the functions the book teaches, and its main commands, so that you can look one up without searching for the chapter that introduced it. It lists only what the chapters use, grouped by tool and by purpose, and each entry names the chapter that explains it, which is where to find an example on the Charles River data. Arguments have short placeholder names, and optional arguments are left out unless the book uses them. The last section sets the three tools side by side, with the same calculations in Excel, SQL, and DAX.
A.1 Excel
The Excel chapters of Part II teach these functions, and a few appear earlier, in the tutorials of Part I. Every formula begins with an equals sign, which the tables leave out. The tables assume Excel for Microsoft 365, the version that What You Need recommends. Older versions lack some of these functions, and the Analysis ToolPak and Solver are add-ins that must be loaded first. Microsoft’s alphabetical list of Excel functions describes each one in full (Microsoft, n.d.).
| Function | What it does | Chapter |
|---|---|---|
XLOOKUP(key, keys, results) |
Finds a key in one column, with an exact match by default, and returns the value in the same row of another column, for the first match. A fourth argument supplies a value when the key is not found | 2, 5 |
VLOOKUP(key, range, n, FALSE) |
Finds a key in the first column of a range and returns the value in its nth column | 5 |
INDEX(range, MATCH(...)) |
MATCH, with 0 as its last argument, finds the position of a key, and INDEX returns the value at that position | 5 |
IF(test, if_true, if_false) |
One of two values, depending on a test | 2, 5 |
IFS(test1, value1, ...) |
The value paired with the first true test | 5 |
AND, OR, NOT |
TRUE if every test is true, if at least one is, or if the test is false | 5 |
IFERROR(value, if_error) |
The value, or a substitute when the value is an error | 5 |
ISBLANK(value) |
TRUE only for a cell that holds nothing, so FALSE for a formula that returns empty text | 5 |
| Function | What it does | Chapter |
|---|---|---|
LEFT(text, n), RIGHT(text, n) |
The first or last n characters | 5 |
MID(text, start, n) |
n characters, starting at a position counted from 1 | 5 |
LEN(text) |
The number of characters | 5 |
FIND(find, text) |
The position of one text inside another, matching case | 5 |
TRIM(text) |
The text without leading, trailing, or repeated spaces | 5 |
CLEAN(text) |
The text without the basic non-printing control characters | 5 |
SUBSTITUTE(text, old, new) |
The text with one string replaced by another | 5 |
CHAR(n) |
The character with code n; CHAR(160) is the non-breaking space, which TRIM leaves in place |
5 |
UPPER, LOWER, PROPER |
The text in capitals, in lower case, or with each word capitalized | 5 |
EXACT(text1, text2) |
TRUE if two texts are identical, including their case, which = ignores |
5 |
VALUE(text) |
The number that a text value represents | 5 |
TEXT(value, format) |
A number or date as text, in a format such as scientific notation | 8 |
| Function | What it does | Chapter |
|---|---|---|
YEAR, MONTH, DAY |
The year, month, or day of a date | 5 |
DATE(year, month, day) |
The date with those parts | 4, 5 |
EOMONTH(date, n) |
The last day of the month n months away; with 0, the last day of the date’s own month | 5 |
EDATE(date, n) |
The same day n months later, or earlier when n is negative, or the month’s last day when that day does not exist | 7 |
DATEDIF(start, end, unit) |
The whole days, months, or years between two dates | 5 |
TODAY() |
Today’s date, updated whenever the workbook recalculates | 5 |
WEEKDAY(date, 2) |
The day of the week, from 1 for Monday to 7 for Sunday | 8 |
| Function | What it does | Chapter |
|---|---|---|
SUM(range) |
The total | 4 |
SUBTOTAL(109, range) |
The total of the visible rows only, so a filter changes it; 103 counts the visible values instead | 4 |
ROUND(x, d), ROUNDUP(x, d) |
x rounded to d decimal places, by ROUND to the nearest value with halves away from zero, by ROUNDUP always away from zero, so ROUNDUP(-3.14, 1) is -3.2 |
4, 5 |
INT(x) |
x rounded down to a whole number | 5 |
MOD(x, d) |
The remainder after dividing x by d | 5 |
ABS(x) |
x without its sign | 7 |
LOG10(x) |
The base-10 logarithm of x | 8 |
COUNTA(range) |
The number of cells that are not empty, including errors and formulas that return empty text | 4 |
COUNTBLANK(range) |
The number of empty cells, including formulas that return empty text but not zeros | 2, 7 |
COUNTIF(range, criteria) |
The number of cells that meet one condition | 5 |
COUNTIFS(range, criteria) |
The number of rows that meet every condition; more range and criteria pairs can follow | 2, 4 |
SUMIFS(sums, range, criteria) |
The total of the rows that meet every condition; more range and criteria pairs can follow | 4 |
AVERAGE, AVERAGEIFS |
The mean of all the values, or of the rows that meet every condition | 4, 6 |
MAX, MIN, MAXIFS, MINIFS |
The largest or smallest value, of all the values or of the rows that meet every condition | 2, 6 |
MEDIAN(range) |
The middle value, or the mean of the two middle values when the count is even | 6 |
STDEV.S, STDEV.P |
The standard deviation of a sample, or of a whole population | 6 |
PERCENTILE.INC(range, k) |
The kth percentile of the values, for k from 0 to 1, interpolated between two values when needed | 4, 6 |
SUMPRODUCT(range1, range2) |
Multiplies two ranges of the same size cell by cell and adds the products | 7 |
CORREL(range1, range2) |
The correlation coefficient of two series | 7 |
FORECAST.LINEAR(x, ys, xs) |
The value of the fitted straight line at x | 7 |
TREND(ys, xs, new_xs) |
The values of the fitted straight line at new points | 7 |
GETPIVOTDATA(field, pivot) |
A value read from a PivotTable by its field, and by items that can follow, so it stays right when the PivotTable changes shape | 6 |
| Function | What it does | Chapter |
|---|---|---|
FILTER(array, include) |
The rows of an array that meet a condition, spilled from the formula’s cell. With no row to return it gives #CALC!, unless a third argument supplies a value | 6 |
UNIQUE(array) |
The distinct values or rows of an array | 7 |
SORT(array), SORTBY(array, by) |
The array sorted by its own values, or by the values of another array | 7, 8 |
SEQUENCE(n) |
The numbers 1 to n | 8 |
RANDARRAY(n) |
n random numbers between 0 and 1, drawn again at every recalculation until they are pasted as values | 8 |
ROWS(array) |
The number of rows of an array or Table column | 8 |
A1# |
The whole spilled range of the formula in A1 | 8 |
| Tool | Where to find it | What it does | Chapter |
|---|---|---|---|
| PivotTable | Insert > PivotTable | Summarizes a Table by the fields placed in its rows, columns, and values | 4, 6 |
| Show Values As | The shortcut menu of a value in a PivotTable | Shows each value as a share of a total, a difference from a base item, or a running total | 6 |
| Calculated Field | PivotTable Analyze > Fields, Items, & Sets > Calculated Field | Adds a field defined by a formula on the sums of other fields, so a ratio is right at every level; not available when the PivotTable is added to the Data Model | 6 |
| Analysis ToolPak | Data > Data Analysis, after loading the add-in | Writes correlation matrices and regression output to a worksheet | 7 |
| Goal Seek | Data > What-If Analysis > Goal Seek | Finds the value of one input that produces a target result | 7 |
| Data Table | Data > What-If Analysis > Data Table | Shows a result across a range of values of one or two inputs | 7 |
| Scenario Manager | Data > What-If Analysis > Scenario Manager | Shows the results under named sets of inputs | 7 |
| Solver | Data > Solver, after loading the add-in | Finds the values of several inputs that give the best result within constraints | 7 |
A.2 Power Query
Power Query is the same editor in Excel, where Part II uses it, and in Power BI, where Part IV does. Its commands record steps that run again at every refresh, and a custom column holds a formula in M, Power Query’s language. M is case-sensitive, and its text positions start at 0, as in Text.Middle, where Excel’s MID and SQLite’s SUBSTR start at 1. Microsoft’s M function reference describes each function (Microsoft, 2025).
| Command | What it does | Chapter |
|---|---|---|
| Get Data | Connects to a source; for CharlesRiver.xlsx, choose its Tables in the Navigator | 4, 13 |
| Choose Columns | Keeps only the columns you select, as the step Removed Other Columns | 4 |
| A column’s filter | Keeps the rows that pass it, before the data load | 4 |
| Data type, Replace current | Sets a column’s type in the Changed Type step itself. Check the types, because for an Excel workbook or a CSV file Power Query detects each column’s type from its first 200 rows | 4, 13 |
| Reference | Starts a new query from another query’s result, which is rebuilt from it at every refresh | 5, 7, 8, 16 |
| Merge Queries | Adds columns from another query by matching a key; expand them without the column-name prefix | 5 |
| Join kind | Left outer keeps every row of the first query; left anti keeps only its rows that have no match | 5 |
| Group By | Totals or counts rows by one or more columns; Advanced allows more than one column or total | 6 |
| Custom Column | Adds a column computed by an M formula | 5 |
| Conditional Column | Adds a column from if-then rules, without writing M | 5 |
| Replace Values | Replaces one value with another in a column | 8 |
| Append Queries | Stacks the rows of two or more queries, matching their columns by name, with nulls in a column that one query lacks | 16 |
| Unpivot Only Selected Columns | Turns the chosen columns into rows of attribute and value | 16 |
| Only Create Connection | In Excel, the Load To choice for a query that only feeds other queries (Close & Load To, or right-click the query under Data > Queries & Connections) | 6, 7, 8 |
| Enable load | In Power BI, cleared for a query that only feeds other queries | 13 |
| Close & Load, Close & Load To, Close & Apply | Loads the queries into Excel, where Close & Load To chooses a Table, a connection only, or the Data Model, or into the Power BI model | 4, 6, 13 |
| Refresh All, Refresh | In Excel, Refresh All runs every query of the workbook again against its source, and Refresh only the selected one. In Power BI, Refresh reloads the model’s tables | 4, 13 |
| Column quality, distribution, profile | Profile each column, on the first rows only unless profiling is set to the entire data set | 13 |
| Function | What it does | Chapter |
|---|---|---|
Date.Year([d]) |
The year of a date; Date.Month gives the month |
5, 7 |
Date.QuarterOfYear([d]) |
The quarter of a date, 1 to 4 | 5 |
Date.ToText([d], "yyyy-MM") |
A date as text, in a format | 13 |
Date.From([dt]) |
The date of a date and time | 16 |
Date.DayOfWeek([d], Day.Monday) |
The day of the week, from 0 for Monday to 6 for Sunday | 16 |
#date(y, m, d) |
The date with those parts | 15 |
Text.Middle([t], start, n) |
n characters from a position counted from 0 | 5 |
Text.From([x]) |
A number or date as text | 5 |
Text.StartsWith([t], "x") |
TRUE if a text begins with another | 14 |
Number.RoundDown([x]) |
x rounded down to a whole number | 5 |
Number.Mod([x], d) |
The remainder after dividing x by d | 16 |
List.Count(List.Distinct([c])) |
In a Group By step’s formula, the number of distinct values of a column in each group | 16 |
A.3 SQL
The SQL chapters of Part III query SQLite through DB Browser for SQLite. SQLite’s documentation describes its functions and the behaviors that differ from other databases (SQLite, n.d.-a, n.d.-b, n.d.-c, n.d.-d, n.d.-e, n.d.-f, n.d.-g). Keywords are written in capitals, by the book’s convention, and the double bar operator joins texts, so a || ' ' || b puts a space between a and b (Chapter 9).
| Clause | What it does | Evaluated | Chapter |
|---|---|---|---|
SELECT |
The columns and expressions to return; DISTINCT removes duplicate rows |
5th | 9 |
FROM, JOIN ... ON |
The tables, and how their rows match | 1st | 9, 10 |
WHERE |
Keeps the rows that meet a condition, before any grouping | 2nd | 9 |
GROUP BY |
One row for each value of the grouping columns | 3rd | 10 |
HAVING |
Keeps the groups that meet a condition | 4th | 10 |
ORDER BY |
Sorts the result, ascending unless DESC follows |
6th | 9 |
LIMIT n |
Returns the first n rows | 7th | 9 |
Window functions are calculated after HAVING and before ORDER BY, which is why they cannot appear in WHERE or HAVING (Chapter 11).
| Function or operator | What it does | Chapter |
|---|---|---|
=, <>, <, >, <=, >= |
Comparisons; = on text is case-sensitive under the default collation |
9 |
BETWEEN a AND b |
Within a range, including both ends | 9 |
IN (a, b, c) |
Equal to any value in the list | 9 |
LIKE 'A%' |
Matches a pattern, in which % stands for any characters; not case-sensitive for the letters A to Z |
9 |
IS NULL, IS NOT NULL |
Has no value, or has one | 9 |
ROUND(x, d) |
x rounded to d decimal places; a negative d is taken as 0 | 9 |
ABS(x) |
x without its sign | 9 |
CAST(x AS type) |
x converted to INTEGER, REAL, or TEXT | 9 |
UPPER(x), LOWER(x) |
x in capitals, or in lower case | 9 |
TRIM(x) |
x without spaces at either end | 9 |
REPLACE(x, a, b) |
x with every a replaced by b | 9 |
LENGTH(x) |
The number of characters in x | 9 |
SUBSTR(x, s, n) |
n characters of x from position s, counted from 1; without n, the rest of x | 9 |
COALESCE(x, y), IFNULL(x, y) |
x, or y when x is NULL | 9 |
CASE WHEN ... THEN ... END |
The result paired with the first true condition, or the ELSE value, or NULL when there is no ELSE | 11 |
COUNT(*), COUNT(column) |
The number of rows, or of values that are not NULL | 10 |
COUNT(DISTINCT column) |
The number of different values that are not NULL | 10 |
SUM, AVG, MIN, MAX |
Totals, averages, and extremes, skipping NULLs | 10 |
GROUP_CONCAT(column, sep) |
The values joined into one text, skipping NULLs, in no guaranteed order | 10 |
strftime('%Y', d) |
A part of a date, as text: %Y the year, %m the month, %w the weekday, 0 for Sunday |
11 |
date(d, modifier) |
A date moved by modifiers such as 'start of month', applied in order |
11 |
julianday(d) |
The date as a number of days, for the difference between two dates | 11 |
printf('%.15e', x) |
x as text in scientific notation, with the fifteen decimals that keep the first digit right | 12 |
LOG10(x) |
The base-10 logarithm of x, one of the math functions that some builds of SQLite leave out, so run SELECT LOG10(10.0), which returns 1 when they are present |
12 |
sqlite_version() |
The version of SQLite in use; window functions need version 3.25 or later | 11 |
| Construct | What it does | Chapter |
|---|---|---|
INNER JOIN t ON ... |
Only the rows that have a match in both tables | 10 |
LEFT JOIN t ON ... |
Every row of the first table, with NULLs where the second has no match | 10 |
| Anti-join | A LEFT JOIN followed by WHERE key IS NULL, on a key of the second table that a match always fills, which keeps the rows without a match |
10 |
NOT EXISTS (subquery) |
The rows for which the subquery finds nothing; unlike NOT IN, it is safe when the list holds NULLs | 10 |
IN (subquery) |
The rows whose value is in the list the subquery returns | 10 |
| Scalar subquery | A subquery that returns one value, used where a value is expected | 10 |
| Correlated subquery | A subquery that refers to the outer row, and runs once for each row | 10 |
| Derived table | A subquery in FROM, named with an alias | 10 |
| Self-join | A table joined to itself under two aliases | 12 |
WITH name AS (...) |
A common table expression, a named query that the later steps of the same statement read | 11 |
UNION ALL |
Stacks the rows of two queries with the same number of columns, matched by position, and keeps duplicates | 12 |
CREATE VIEW name AS |
Saves a query in the database. To replace a view, run DROP VIEW IF EXISTS first, and TEMP keeps a view for the connection only |
11 |
| Function or clause | What it does | Chapter |
|---|---|---|
ROW_NUMBER() OVER (...) |
A sequence number within the partition, even for ties | 11 |
RANK(), DENSE_RANK() |
A rank in which ties share a number; RANK skips the numbers after a tie | 11 |
SUM(x) OVER (...) |
A total over the window: the whole partition, or a running or moving total; AVG, COUNT, MIN, and MAX work the same way | 11 |
LAG(x, n), LEAD(x, n) |
The value of x n rows before, or after, the current row | 11 |
PARTITION BY column |
Divides the rows into groups that the window never crosses | 11 |
ORDER BY inside OVER |
Orders each partition; an aggregate’s default window then runs to the current row and the rows that tie with it | 11 |
ROWS BETWEEN ... |
With n PRECEDING AND CURRENT ROW, the current row and the n before it; ROWS UNBOUNDED PRECEDING runs from the first row |
11 |
WINDOW w AS (...) |
Names a window, for use as OVER w |
11 |
| Behavior | What it means | Chapter |
|---|---|---|
| Integer division | 7 / 2 returns 3; multiply one side by 1.0 for a decimal result |
9 |
% |
Returns the remainder, after dropping the decimals of both numbers | 9 |
| Comparisons with NULL | An ordinary comparison, such as = or <, is never true, so test for a missing value with IS NULL |
9 |
| Sorting NULLs | NULLs come first in ascending order, by default | 9 |
| Dates | Stored in the Charles River database as text in the form YYYY-MM-DD, so they compare and sort correctly as text. A range on a column that also stores a time must end before the next day | 9 |
| Type affinity | A value compared with a column, or with a CAST, is converted to that type where it can be. A typed value or a function’s result, such as SUBSTR’s, has no affinity, so SUBSTR(x, 1, 4) = 2026 finds no rows. Compare with '2026', or CAST the text first |
9, 11 |
| Double quotes | A double-quoted value is read as a column name, and as text only when no column has that name and the build allows it, so write text in single quotes | 9 |
| A missing comma | Can make the next column an alias of the one before it, a logical error with no message | 9 |
| An alias in GROUP BY | Accepted by SQLite, though some databases, such as SQL Server, reject it | 10 |
A.4 DAX
The Power BI chapters of Part IV write DAX in measures, calculated columns, calculated tables, and queries. The book puts a space inside each parenthesis and quotes the table names Date and Item, which are reserved words (Chapter 14). Microsoft’s DAX function reference describes each function (Microsoft, 2023). The time intelligence functions appear in the classic form that Chapter 14 teaches, which takes the date column of the marked Date table.
| Function | What it does | Chapter |
|---|---|---|
SUM ( column ) |
Adds up a column over the rows in the filter context | 14 |
COUNTROWS ( table ) |
The number of rows of a table, or a blank when it has none | 14 |
DISTINCTCOUNT ( column ) |
The number of different values of a column, counting a blank as a value | 14 |
MAX ( column ), MIN ( column ) |
The largest or smallest value | 14 |
DIVIDE ( a, b ) |
a divided by b, or a blank when b is zero | 14 |
SUMX ( table, expression ) |
Evaluates an expression row by row and adds the results | 14 |
MINX ( table, expr ), MAXX ( table, expr ) |
The smallest or largest result of an expression over a table | 16 |
ROUND ( x, d ), ABS ( x ) |
x rounded to d decimal places, or x without its sign | 14 |
LOG10 ( x ) |
The base-10 logarithm of x | 16 |
| Function | What it does | Chapter |
|---|---|---|
CALCULATE ( expr, filter ) |
Evaluates an expression in a modified filter context; more filters can follow | 14 |
CALCULATETABLE ( t, filter ) |
The same, for a table | 14 |
FILTER ( table, condition ) |
The rows of a table that meet a condition | 14 |
REMOVEFILTERS ( table ) |
Inside CALCULATE, removes the filters from a table or column | 14 |
ALL ( table ) |
A table or column without its filters | 14 |
KEEPFILTERS ( condition ) |
Adds a filter to the existing ones, instead of replacing a filter on the same column | 15 |
VALUES ( column ) |
The distinct values of a column in the filter context; DISTINCT also leaves out the blank row added for keys without a match |
14 |
TREATAS ( { list }, col ) |
Applies a list or table of values as a filter on a column | 14 |
CROSSFILTER ( c1, c2, dir ) |
Changes a relationship’s filter direction inside CALCULATE | 14 |
USERELATIONSHIP ( c1, c2 ) |
Activates an inactive relationship inside CALCULATE | 14 |
RELATED ( column ) |
A value from the one side of a relationship, row by row | 14 |
HASONEVALUE ( column ) |
TRUE when the filter context leaves one value of a column | 14 |
SELECTEDVALUE ( column ) |
The value of a column when only one remains, otherwise a blank | 15 |
| Function | What it does | Chapter |
|---|---|---|
CALENDAR ( start, end ) |
A table of every date between two dates | 14 |
DATE, YEAR, QUARTER, MONTH |
Build a date from its parts, or return one part | 14 |
EDATE ( date, n ) |
The same day n months later, or earlier when n is negative, or the month’s last day when that day does not exist | 14 |
TOTALYTD ( expr, dates ) |
A measure’s total for the year to date, from January 1 | 14 |
SAMEPERIODLASTYEAR ( dates ) |
The same dates one year earlier | 14 |
DATEADD ( dates, n, unit ) |
The dates shifted by n days, months, quarters, or years | 14 |
DATESBETWEEN ( dates, a, b ) |
The dates between two dates, inclusive | 14 |
DATESINPERIOD ( dates, start, n, unit ) |
The dates of n intervals from a start date, or, with a negative n, of the period that ends on it, such as the trailing twelve months | 15 |
| Function or keyword | What it does | Chapter |
|---|---|---|
IF ( test, then, else ) |
One of two results, depending on a test | 14 |
SWITCH ( x, value, result ) |
The result paired with the first value that x equals; more pairs and a final default can follow | 15 |
ISBLANK ( x ), NOT ( x ) |
TRUE if x is blank; the opposite of a test | 14 |
FALSE ( ) |
The logical value FALSE, as in a test that a flag is not set | 14 |
x IN { a, b } |
TRUE if x is one of the listed values | 14 |
FORMAT ( x, format ) |
A number or date as text, in a format | 14 |
VALUE ( text ) |
The number that a text value represents | 16 |
RIGHT ( text, n ) |
The last n characters of a text | 16 |
CONCATENATEX ( t, expr, sep ) |
The results of an expression over a table, joined into one text | Publishing appendix |
USERPRINCIPALNAME ( ) |
The sign-in name of the person viewing the report | Publishing appendix |
ADDCOLUMNS ( t, name, expr ) |
A table with calculated columns added | 14 |
SELECTCOLUMNS ( t, name, x ) |
A table of the named columns only | 16 |
SUMMARIZECOLUMNS ( ... ) |
One row for each combination of grouping columns, with named expressions; the usual body of a query | 14 |
SUMMARIZE ( t, col, ... ) |
One row for each combination of the grouping columns found in a table, as in a test that a key is unique | 16 |
DISTINCT ( table ) |
The distinct rows of a table or table expression | 16 |
UNION ( t1, t2 ) |
The rows of two tables with the same number of columns stacked, matched by position, with duplicates kept | 14 |
ROW ( name, x ) |
A table of one row | 14 |
{ a, b, c } |
A table of the listed values | 14 |
VAR name = expr RETURN ... |
Names an intermediate result and uses it | 14 |
DEFINE, EVALUATE, ORDER BY |
The parts of a DAX query, of which only EVALUATE is required: measures defined for the query, the table to return, and its order | 14 |
NAMEOF ( [measure] ) |
The name of a measure or column, as a field parameter stores it | 15 |
| Function | What it does | Chapter |
|---|---|---|
RUNNINGSUM ( [x] ) |
The running total down the rows of the visual | 15 |
MOVINGAVERAGE ( [x], n ) |
The average of the last n rows, or of fewer at the start of the axis | 15 |
PREVIOUS ( [x] ) |
The value of the previous row | 15 |
FIRST ( [x] ) |
The value of the first row | 15 |
COLLAPSE ( [x], ROWS ) |
x evaluated at the parent level of the rows, so a ratio is calculated again there rather than added up | 15 |
A.5 The Same Calculation in Three Tools
The chapters return to a handful of calculations in each tool. Table A.19 sets them side by side, with the chapters in parentheses, so that a technique learned in one Part can be found in the others. The entries of a row answer the same question, but their results agree only when the population, the grain of the rows, the treatment of blanks, the dates, and the filters agree as well. Some entries give only part of the answer, such as the previous period’s value, which a subtraction completes.
| Task | Excel | SQL | DAX and Power BI |
|---|---|---|---|
| Total under a condition | SUMIFS (4) | SUM with WHERE, or with GROUP BY (10); SUM of a CASE (11) | CALCULATE with a filter (14) |
| Count distinct values | COUNTA of UNIQUE, on a column without blanks (7) | COUNT(DISTINCT), which skips NULL (10) | DISTINCTCOUNT, which counts a blank as a value (14) |
| Bring in a value from another table | XLOOKUP, or a merge in Power Query (5) | A JOIN on the key (10) | A relationship, and RELATED row by row (14) |
| Find rows with no match | A left anti merge, or COUNTIFS against the parent table (2, 5) | An anti-join or NOT EXISTS (10) | A (Blank) group in a visual can signal keys with no match, though a blank in the grouping column also shows as (Blank), so check the child keys to find the rows (13, 14) |
| Summarize by group | A PivotTable, or Group By in Power Query (4, 6) | GROUP BY (10) | A matrix visual, or SUMMARIZECOLUMNS in a query (13, 14) |
| Share of a total | Show Values As % of Grand Total (6) | A value divided by its SUM over an empty window, OVER () (11) | DIVIDE with REMOVEFILTERS (14) |
| Running total | Show Values As Running Total In (6) | SUM over a window ordered by date (11) | TOTALYTD, which starts again each January, or the RUNNINGSUM visual calculation, which runs down the rows the visual shows (14, 15) |
| Change from the previous period | Show Values As Difference From (6) | A value less its LAG (11) | A measure less its value under DATEADD or SAMEPERIODLASTYEAR, or less PREVIOUS in a visual calculation (14, 15) |
| Trailing twelve months | Not covered | A window of the current row and the 11 before it, on one row for each month (11) | DATESINPERIOD over 12 months, or MOVINGAVERAGE, which averages the rows rather than totaling them (15) |
A.6 References
Microsoft. (n.d.). Excel functions (alphabetical). Microsoft Support. https://support.microsoft.com/en-us/office/excel-functions-alphabetical-b3944572-255d-4efb-bb96-c6d90033e188
Microsoft. (2023). DAX function reference. Microsoft Learn. https://learn.microsoft.com/en-us/dax/dax-function-reference
Microsoft. (2025). Power Query M function reference. Microsoft Learn. https://learn.microsoft.com/en-us/powerquery-m/power-query-m-function-reference
Microsoft. (2026). Visual calculations overview. Microsoft Learn. https://learn.microsoft.com/en-us/power-bi/transform-model/desktop-visual-calculations-overview
SQLite. (n.d.-a). Built-in aggregate functions. https://www.sqlite.org/lang_aggfunc.html
SQLite. (n.d.-b). Built-in mathematical SQL functions. https://www.sqlite.org/lang_mathfunc.html
SQLite. (n.d.-c). Built-in scalar SQL functions. https://www.sqlite.org/lang_corefunc.html
SQLite. (n.d.-d). Datatypes in SQLite. https://www.sqlite.org/datatype3.html
SQLite. (n.d.-e). Date and time functions. https://www.sqlite.org/lang_datefunc.html
SQLite. (n.d.-f). Quirks, caveats, and gotchas in SQLite. https://www.sqlite.org/quirks.html
SQLite. (n.d.-g). Window functions. https://www.sqlite.org/windowfunctions.html