Professional Documents
Culture Documents
Power Pivot and Power BI
Power Pivot and Power BI
Power Pivot and Power BI
3 Apply the Coordinates in the filter context to each of the respective tables (Calendar
and Products in this
this example). This results in a set of “active”
“active” rows in each of
of those
tables.
5 Evaluate the Arithmetic: Once all filters are applied and all relationships have been
followed, evaluate the arithmetic – SUM(), COUNTROWS(), etc. in the formula against the
remaining active rows.
6 Return Result: The result of the arithmetic is returned to the current measure cell in
the pivot (or dashboard, etc.), then the process starts over at step 1 for the next
measure cell.
PowerPivotPro LLC ALLOWS and ENCOURA
ENCOURAGESGES reprinting and/or electronic distribution of this reference ma material,
terial, at no charge, provided: 1) it is being
used strictly for free educational purposes and 2) it is reprinted or distributed in its entirety, including all pages, and w ithout alteration of any kind.
1 2
3 4
In #5, we’ve swapped
Territories[Country]
from Rows to Columns,
and Products[Category]
from Columns to Rows.
We’ve also turned off
display of grand totals.
5
In 6-8, Territories[Continent] and Territories[Region]
Territories[Region] are on Rows. Customers[Gender] is on Report Filters. In 6 and 7, Customers[Gender]
Is not filtered, but in 8, it is filtered to “F”. In 6-8, [Total Sales] and [Orders] are on Values.
6 7 8
9
5) Same as #1!
6) Territories[Continent]=“North
Territories[Continent]=“North America”,
Territories[Region]=“Northwest”
ALL() Function
ALL(<table>) or ALL(Table[Col1], Table[Col2], …Table[ColN])
…Table[ColN]) VALUES() Function
VALUES(Table[Column])
Basic usage: As a <filter> argument to CALCULATE()
Removes filters from specified table or column(s) 1-column table, unique: Produces a temporary, single-column table during
during formula
Strips those tables/columns from the pivot's filter context (Most common usage) evaluation
That table contains ONLY the UNIQUE
UNIQUE values of
Advanced Usage: Technically, ALL() returns a table Table[Column].
So it is also useable wherever a <table ex pr> is required
…such as the first argument to FILTER() EX: CALCULATE(<measure>,
FILTER(VALUES(Customers[PostalCode]), …)
…)))
30-day
30-day Mov
Moving
ing Avg
Avg:: CALCUL
CALCULATE
ATE(<m
(<meas
easure
ure>,
>, Note: VALUES(Table[Column]) returns filtered list even if
DATESINPERIOD(Calendar[Date], Table[Column] isn't on pivot!
MAX(Calendar[Date]), -30, Day
)
) / 30 Forcing Grand/Sub Totals to Be the Sum of Their "Parts"
=SUMX( VALUES(Table[Column], <original
<original measure>)
Time Intelligence with Custom Calendar
When Your Biz Calendar
Calendar is Too Complex for the Built-In Functions (Where the values of Table[Column] are the “small pieces” that need
to be calculated indivi dually and then added up.)
=CALCULATE( <measure expr>,
FILTER(ALL(<Custom Cal Table>), <custom filter>),
<optional VALUES() to restore filters on some Cal fields>
Calc Column
Columnss That Reference "Previous"
"Previous" Row(s)
)
=CALCULATE([Sales],
=CALCULATE([Sales], =CALCULATE( [Measure],
FILTER(ALL(Cal445), Cal445[Year]=MAX(Cal44
Cal445[Year]=MAX(Cal445[Year])-1)
5[Year])-1) FILTER(<table>, Table[Col]=EARLIER(Table[Col])-1)
)
)
=CALCULATE([Sales],
=CALCULATE([Sales], =CALCULATE( AVERAGE(Tests[Score]),
FILTER(ALL(Cal445), Cal445[Year]=MAX(Cal44
Cal445[Year]=MAX(Cal445[Year])-1),
5[Year])-1), FILTER(Tests, Tests[ID]=EARLIER(Tests[ID])-1)
VALUES(Cal445[MonthOfYear]) )
)
More info at http://ppvt.pro/GFITW
Suppressing Subtotals/Grand Totals
=IF(HASONEVALUE(Table[Column]),
=IF(HASONEVALUE(Table[Column]), <measure expr for non-totals>, BLANK())
SWITCH() Function
Alternative to Nested IF’s!
IF’s !
=SWITCH(<value to test>, RANKX() Function
<if it matches this value>, <return this value>, RANKX(<table expr>, <arithmetic expression>, <optional alternate arithmetic expression>,
<if it matches this value>, <return this value>, <optional sort order flag>, <optional tie- handling flag>)
…more match/return pairs
pairs…,
…, S im
im pl
pl es
es t Us ag
ag e:
e: R AN
AN KX
KX( AL
AL L(
L( Ta
Ta bl
bl e[
e[ Co
Co lu
lu mn
mn ])]) , <n um
ume ri
ri ca
ca l e xp
xp r>
r>)
<if no matches found, return this optional “else” value> EX: RANKX(ALL(Products[Name]), [TotalSales])
)
Ascend
Ascending
ing Ran
Rank
k Ord
Order:
er: EX: RANKX(A
RANKX(ALL(P
LL(Prod
roduct
ucts[N
s[Name
ame]),
]), [Tot
[TotalS
alSales
ales],,
],,1)
1)
"Dense
"Dense"" Tie Han
Handlin
dling:
g: EX: RANKX
RANKX(ALL
(ALL(Pr
(Produ
oducts
cts[Na
[Name]
me]),
), [Tot
[TotalS
alSales
ales],,
],,,De
,Dense
nse))
Need Training? Advice? Or Help with a Project?
DIVIDE Function
Contact Us:
Returns BLANK() Cells on “Div
“Div by Zero”, No IF() or IFERROR() required!
Simple@PowerPivotPro.com
=DIVIDE( <numerator>, <denominator>,
<denominator>, <optional val to return when div by zero>)
zero>)
4
▪ Contain the numbers Lookup Tables
Data Tables ▪ EX: Sales, Budget, Inventory.
▪ Sometimes called “fact” ▪ Tend to have fewer rows than data tables
tables ▪ EX: Calendar, Customers, Stores, Products.
▪ Measures/calc fields
fields tend to ▪ Sometimes called “dimension,” “reference,”
come from data tables or “master” tables
▪ In diagram view, the “dot” or ▪ Row, Column, Report Filter, and Slicer fields
“*” end of a relationship. ▪ In diagram view, the “arrow” or “1” end of a
▪ Relationship columns relationship.
usually contain duplicate ▪ Relationship columns CANNOT contain
values duplicate values
Note:
• Data tables are “spliced together” ONLY by sharing
one or more Lookup tables
• Now follow the field list guidelines above and you
can compare Budget v Actuals (for instance) in a
single pivot!
• Data tables are never related directly to each other!
Also:
• Useful trick: Arrange Lookup tables
tables “up high” on the diagram and
Data tables “down low.”
• This lets us envision filters flowing “downhill”
“downhill” across relationships
relationships
+ )
SUM() SUM()
+
When writing measures/calc fields:
1) Always INCLUDE table names
n ames on column references.
references. 2) Always EXCLUDE table names when referencing
other measures.
Table[Column] [Column] [Measure] Table[Measure]
YES NO YES NO
By following this convention, you will ALWAYS immediately know the difference between a measure and a
column reference, on sight, and that’s a BIG win for readability and debugging.
(But when writing a calc column, it is acceptable to omit the table name from a column reference, since
you rarely reference measures in calc columns.)
YES NO
(See re-use & maintenance benefits
ben efits in DAX Formulas for
Power Pivot , Ch6)
Uncheck!
OR
Uncheck unneeded columns during import 1) Delete unneeded columns, 2) Refresh the table.
(or by going to Table Properties later). and then…
1. Only import
import the
the columns
columns that you truly
truly need! (you cancan always
always go grab mor
moree columns later
later if needed).
needed).
2. For your
your Data tables,
tables, 5-10
5-10 columns
columns is a good
good goal (Lookup
(Lookup tables can have many
many more
more than that).
3. If you
you delete
delete a colum
column n after
after import
import,, refresh
refresh that
that table
table – the engine re-optimizes the storage during refresh.
NO
Lookup1 YES
Uncheck these for
a speed boost
Data Table
Data Table
NO
The table pictured above combines Data table columns (OrderDate, CustomerKey, ExtendedAmount, and ProductKey) with
columns that should be “outsourced” to a Lookup table
t able (ProductName,
(ProductName, StandardCost, Color,
Color, and ModelName can all be
“looked up” from the ProductKey).
YES
Duplicate removal makes a relationship possible with the Data table,
AND makes the Lookup table small in terms of row count.
NO
NO
This “unpivot
“unpivot”” transformation results in increased rows but fewer
columns. Counterintuitively this can yield
yield VERY significant file size
reduction. (See Power Pivot Alchemy, Ch 5, for an example of
performing this transformation with Power Query).
In the case of dates or months, this also removes the need for YES
tedious formula repetition, AND enables time intelligence calcs.
In this case you will need to use
YES CALCULATE to write your “base”
measures. EX:
Advice?
Need Training? Advice? Or Help with a Project? CALCULATE(SUM(Table[Amount]),
Contact Us: Table[Amount Type]=“Refunds”
Type]=“Refunds”)
)
Simple@PowerPivotPro.com
1. Must contai
containn a column
column of actual
actual Date data
data type,
type, not
not just text or a number that looks
looks like a date.
date.
2. Thatt Date
Tha Date co
colum
lumnn must
must NOT
NOT cont
contain
ain time
timess – 12:00 AM is “zero time” and is EXACTLY what you want to see.
3. There CANNOT be “gaps” in the Date column.
column. No skipped dates, even if your business isn’t open on those days.
4. Must be “Marked as Date Table” via button on the Power Pivot window’s ribbon (not applicable in Power BI Desktop).
5. May con
contai
tain
n as many
many oth
other
er colu
columns
mns as desir
desired
ed.. Go nuts
nuts ☺
6. Should not contain dates that “precede” your actual data – needless rows DO impact performance.
7. You
You MUST the
then n use
use this
this as a prop
proper
er Look
Lookup
up tab
table
le – don’t use dates from your Data tables on Rows/Columns/Etc.!
Rows/Columns/Etc.!
• You HAVE a Row Context in a Calculated Column. • You HAVE a Filter Context
Context in a Measure / Calc Field.
• But you do NOT have a Row Context in a Measure • But you do NOT have a Filter Context in a Calc Column.
(Calculated Field). • Each cell in a Pivot’s values area is calculated based on
on
• A calc column is calculated on a row-by-row basis, so the filters (coordinates) specified for that cell.
there’s one row “in play” for each evaluation of the • Those filters resolve to a set of multiple rows in the
formula. underlying data tables, rather than a single row.
• So =[Column] resolves to a single value (the value from • =[Column] is therefore illegal as a formula, or as part of
“this row”), w/out error. a formula where a single value is needed.
• “The current row” is called Row Context. • So this is why aggregation functions are required in
• You may only reference
refer ence a “naked’ column
column (naked = no measures – to “collapse” multiple values
values into one.
aggregation fxn), and have it resolve to a single number,
date, or text value when you have a Row Context.
Exce
Except
ptio
ion:
n: Fi
Filt
lter
er Co
Cont
nte
ext in Ca
Calc
lc Co
Colu
lumn
mnss Exce
Except
ptio
ion:
n: Ro
Row
w Co
Cont
nte
ext in Me
Meas
asur
ures
es
• Aggregation functions like SUM *always*
* always* reference the • Certain functions step through tables one row at a time,
Filter Context even when used within a Measure.
• Since there is no Filter Context in a calc column, • Those “iterator” functions are said to create Row
=SUM([Column]) will return the sum of the ENTIRE Contexts during their operation.
column – you get the same answer all the way down. • Ex: FILTER( table
table,, expr ) and SUMX( table
table,, expr )
• But you can tell the DAX engine to use a Row Context as • In both examples, you CAN reference a column, within
if it were ALSO a Filter Context, by wrapping
wr apping the the expr argument, and use that column as a single
aggregation function in a CALCULATE. value, within the expr argument.
• EX: =CALCULATE(SUM[Column])) “respects” the context • Note however that the column MUST “come from” the
of each row, AND also relationships table specified in the table argument.
• So in a Lookup table, you can use • Also note that this Row Context only exists within the
CALCULATE(SUM(Data[Col]))
CALCULATE (SUM(Data[Col])) to get the sum of all evaluation of the iterator function itself (FILTER, SUMX,
“matching” rows from the related Data table. etc.) and does NOT exist elsewhere in the measure
•