Companion content
Insert your email address and press Download for access to the files used in this book.Errata corrige
To ensure the ongoing accuracy of this book and its companion content, we have reviewed and confirmed the errors listed below. If you find a new oversight not included in both of the following sections, please report it to us.
Important issues
Corrections in this section are important to fully understand the concepts explained in the book.-
Page 322: FILTERS instead of FILTER
In section “Understanding differences between VALUES and FILTERS” at paragraph 2 line 4 the sentence “VALUES returns two colors, whereas FILTER returns all the filtered four.” inaccurately references FILTER instead of FILTERS. The right sentence is: “VALUES returns two colors, whereas FILTERS returns all the filtered four.”
-
Page 331: Wrong column reference in code
Line 4 of the second code block in the page should reference Customer[CustomerKey] instead of Sales[CustomerKey].
The right code is the following:NonBuyingCustomers := VAR SelectedCustomers = CALCULATETABLE ( DISTINCT ( Customer[CustomerKey] ), ALLSELECTED () ) VAR CustomersWithoutSales = FILTER ( SelectedCustomers, ISEMPTY ( RELATEDTABLE ( Sales ) ) ) VAR Result = COUNTROWS ( CustomersWithoutSales ) RETURN Result
-
Page 407: Wrong figure reference
The paragraph after Figure 13-12 inaccurately references another figure; the final sentence of that paragraph should read:
the result is similar to Figure 13-12, but with smaller amounts:
-
Page 555: Value encoding can be used for any numeric type, including floating points.
The third paragraph in the page must be changed to the following one:
Value encoding only takes place for numeric columns because it cannot be applied to strings. Be mindful that VertiPaq stores the Currency data type of DAX (also called Fixed
Decimal Number) as an integer value. Therefore, currencies can be value-encoded as integers too, whereas the Decimal data type (also called Decimal Number) numbers can be value encoded when their floating-point content can be represented with integer values by applying mathematical transformations to the original value.
Minor issues
Corrections in this section do not affect the ability to learn the concepts explained in the book.-
Page 8: Replace understood with understand
In the section, “DAX requires theory” paragraph 2, lines 4-5 the verb in the sentence “The problem is not DAX but the fact that you do not yet understood exactly how DAX works.” is incorrect. The sentence should read, “The problem is not DAX but the fact that you do not yet understand exactly how DAX works.”
-
Page 50: Fix comma position in string to search
The second line of the sample code should use “, ” instead of ” ,” in the first FIND argument.
The right line is the following:People[Comma2] = IFERROR ( FIND ( " ,", People[Name], People[Comma1] + 1 ), BLANK ( ) )
-
Page 52: Missing MonthNumber column in Figure 2-10
Figure 2-10 should show a column named “MonthNumber” and the content in each visible row should be 1.
-
Page 53: Missing “s” in Cell Phones category name
The third line of the code after Figure 2-11 must compare the Category with the Cell Phones string instead of Cell Phone.
The right line should be:RELATED ( 'Product Category'[Category] ) = "Cell Phones",
-
Page 63: ALLCROSSFILTERED misspelling
The word “ALLCROSSFILTERD” is misspelled in “ALLCROSSFILTRD” in the first paragraph of the “Introducing ALL and ALLEXCEPT” section.
-
Page 67: Inaccurate comparison in DAX code
The comparison at line 15 in the sample code should be “>” instead of “>=”. The right code is the following:
BestCategories = VAR Subcategories = ALL ( 'Product'[Category], 'Product'[Subcategory] ) VAR AverageSales = AVERAGEX ( Subcategories, SUMX ( RELATEDTABLE ( Sales ), Sales[Quantity] * Sales[Net Price] ) ) VAR TopCategories = FILTER ( Subcategories, VAR SalesOfCategory = SUMX ( RELATEDTABLE ( Sales ), Sales[Quantity] * Sales[Net Price] ) RETURN SalesOfCategory > AverageSales * 2 ) RETURN TopCategories
-
Page 73: Replace Color with Brand
In the last paragraph of the page, the first sentence references “Color” instead of “Brand”. The right sentence is “The Brand Name measure uses COUNTROWS to check whether the Brand column of the Products table only has one value selected.”
-
Page 82: Inverted reference to the Total column and row
In the first paragraph after Figure 4-3 the sentence, “In the Total row, the filter is only on the brand, whereas in the Total column the filter is only on the year.” should be the other way around.
The right sentence reads, “In the Total row, the filter is only on the year, whereas in the Total column the filter is only on the brand.”. -
Page 83: Replace country with continent
In the first paragraph after Figure 4-4 the word “country” must be replaced by “continent”. The right sentence is “Now the filter context of each cell is filtering brand, continent, and year.”
-
Page 84: Missing selection in Figure 4-6
The year “CY 2007” should be selected in Figure 4-6 to crosshighlight the other visuals in the report. The explanation in the book is based on such a selection, which is missing from the screenshot.
-
Page 89: Replace Unit Cost with Net Price for GrossMargin% calculation
The code snippet must have Net Price instead of Unit Cost in the denominator of the GrossMargin% calculation. This does not affect the explanation of the section, but it is the right calculation of Margin.
GrossMargin% := ( Sales[Net Price] - Sales[Unit Cost] ) / Sales[Net Price]
-
Page 91: Missing comma after RELATEDTABLE ( Sales )
The sample code does not have a comma after line 6 containing RELATEDTABLE ( Sales ). The right code is the following:
SUMX ( 'Product Category', -- Scans the Product Category table SUMX ( -- For each category RELATEDTABLE ( 'Product' ), -- Scans the category products SUMX ( -- For each product RELATEDTABLE ( Sales ), -- Scans the sales of that product Sales[Quantity] -- * 'Product'[Unit Price] -- Computes the sales amount of that sale * 'Product Category'[Discount] ) ) )
-
Page 94: Missing space in Product[Unit Price] column reference
In Figure 4-10, the first reference to Product[UnitPrice] must be read as Product[Unit Price]
-
Page 157: Small change in last paragraph
Change the first sentence in the last paragraph from:
The Product Sales column correctly computes the sum of Sales Amount only for the current product in the Product table.
To:
The Product Sales column computes the sum of Sales Amount for only the current product in the Product table.
-
Page 157: Missing parenthesis after CALCULATE
In the last code snippet an opening parenthesis is missing after CALCULATE .
The right code is the following:'Product'[Product Sales] = CALCULATE ( SUMX ( Sales, Sales[Quantity] * Sales[Net Price] ) )
-
Page 161: Replace Unit Cost with Net Price in margin calculation
The second code in the page should reference Net Price instead of Unit Cost in the Margin and MarginPct calculation. This does not affect the explanation of the page for the circular dependency, but here is the right calculation of Margin:
Sales[MarginPct] = DIVIDE ( Sales[Margin], Sales[Net Price] ) Sales[Margin] = Sales[MarginPct] * Sales[Net Price]
-
Page 167: Wrong definition of the Delivered Amount 2007 v2 measure
The code for the Delivered Amount 2007 v2 measure in the first code sample makes incorrect use of USERELATIONSHIP.
The code should be the following – the only difference is on the first line:Delivered Amount 2007 v2 = CALCULATE ( CALCULATE ( [Sales Amount], FILTER ( Sales, RELATED ( 'Date'[Calendar Year] ) = "CY 2007" ) ), USERELATIONSHIP ( Sales[Delivery Date], 'Date'[Date] ) )
-
Page 173: Improved definition of CALCULATE steps
The step 5 should be worded this way:
CALCULATE applies the explicit filter arguments evaluated at 1. to the new filter context generated after step 4. These filter arguments are applied to the new filter context once the context transition has happened so they can overwrite it, after filter removal—their filter is not removed by any ALL* modifier—and after the relationship architecture has been updated. However, the evaluation of filter arguments happens in the original filter context, and it is not affected by any other modifier or filter within the same CALCULATE function. If a filter argument is modified by KEEPFILTERS, the filter is added to the filter context without overwriting existing filters over the same column(s).
-
Page 176: Replace TotalCost with SalesAmount in the denominator of the Margin% calculation
Use SalesAmount instead of TotalCost at line 9 of the second code block. The right code is the following:
Margin% := VAR SalesAmount = SUMX ( Sales, Sales[Quantity] * Sales[Net Price] ) VAR TotalCost = SUMX ( Sales, Sales[Quantity] * Sales[Unit Cost] ) VAR Margin = SalesAmount - TotalCost VAR MarginPerc = DIVIDE ( Margin, SalesAmount ) RETURN MarginPerc
Use Sales[Net Price] instead of Sales[Unit Cost] at line 12 of the last code block. The right code is the following:
Margin% := DIVIDE ( SUMX ( Sales, Sales[Quantity] * Sales[Net Price] ) - SUMX ( Sales, Sales[Quantity] * Sales[Unit Cost] ), SUMX ( Sales, Sales[Quantity] * Sales[Net Price] ) )
-
Page 184: Minor changes to sample code
The measure Sales Large Customers in the first code snippet does not compute the amount correctly in any condition. While this is not required to understand the concept of variables, the right code should be the following:
Sales Large Customers := VAR LargeCustomers = FILTER ( Customer, [Sales Amount] > 10000 ) VAR WorkingDaysIn2008 = CALCULATETABLE ( VALUES ( 'Date'[Date] ), 'Date'[IsWorkingDay] = TRUE (), 'Date'[Calendar Year] = "CY 2008", ALL ( 'Date' ) ) RETURN CALCULATE ( [Sales Amount], LargeCustomers, KEEPFILTERS ( WorkingDaysIn2008 ) )
-
Page 192: Missing semicolon (:) for measure definition
The code at page 192 defines a measure. Therefore, the assignment symbols must be := instead of =.
The code should be the following (the only difference is on the first line):Date of Max := VAR MaxDailySales = [Max Daily Sales] VAR DatesWithMax = FILTER ( VALUES ( 'Date'[Date] ), [Sales Amount] = MaxDailySales ) VAR Result = IF ( COUNTROWS ( DatesWithMax ) = 1, DatesWithMax, BLANK () ) RETURN Result
-
Page 196: Inverted Sales Amount and Products columns
Figure 7-6 on page 197 shows the Sales Amount and Products columns as inverted, compared to the order defined in the code shown on page 196.
In order to get the result shown in Figure 7-6 on page 197, the code on page 196 should be:Colors = ADDCOLUMNS ( VALUES ( 'Product'[Color] ), "Sales Amount", [Sales Amount], "Products", CALCULATE ( COUNTROWS ( 'Product' ) ) )
-
Page 197: Inverted Sales Amount and Products columns
Figure 7-6 on page 197 shows the Sales Amount and Products columns as inverted compared to the order defined in the code shown on pages 196 and 197.
The code on page 197 should be:Colors = SELECTCOLUMNS ( VALUES ( 'Product'[Color] ), "Color", 'Product'[Color], "Sales Amount", [Sales Amount], "Products", CALCULATE ( COUNTROWS ( 'Product' ) ) )
-
Page 204: RANKX evaluates the third parameter in the original filter context
In step 2. RANKX evaluates the third (not the second) parameter in the original filter context. The correct sentence is “2. RANKX evaluates its third parameter in the original filter context.”
-
Page 207: Typo in ‘Sales Ranking'[Sale] column reference
The first line contains a typo in the column reference that should be ‘Sales Ranking'[Sales] instead of ‘Sales Ranking'[Sale].
-
Page 236: Missing bracket in sample code
The second definition of Fiscal YTD Sales in the third code snippet of the page is missing a bracket. The right code is the following:
Fiscal YTD Sales := TOTALYTD ( [Sales Amount], 'Date'[Date], "06-30" ) Fiscal YTD Sales := CALCULATE ( [Sales Amount], DATESYTD ( 'Date'[Date], "06-30" ) )
-
Page 240: Wrong measure name (YTD should be used instead of PY)
The first sample code uses the wrong prefix; it should be YTD instead of PY.
The correct code is the following:YTD Sales := CALCULATE ( [Sales Amount], DATESYTD ( 'Date'[Date] ) ) -- is equivalent to YTD Sales := CALCULATE ( [Sales Amount], DATESYTD ( CALCULATETABLE ( DISTINCT ( 'Date'[Date] ) ) ) )
-
Page 262: Translation of DATESYTD using the second argument
The corresponding FILTER of DATESYTD described in the third code sample of the page should be the following:
VAR LastInSelection = MAX ( 'Date'[Date] ) VAR SelectionEndOfYear = DATE ( YEAR ( LastInSelection ), <month>, <day> ) VAR DifferentYear = ( SelectionEndOfYear >= LastInSelection ) VAR LastDayPreviousYear = DATE ( YEAR ( LastInSelection ) - DifferentYear, <month>, <day> ) RETURN FILTER ( ALL ( 'Date'[Date] ), 'Date'[Date] > LastDayPreviousYear && 'Date'[Date] <= LastInSelection )
-
Page 301: Inverted comments in source code
The comments in the second code snippet must be inverted.
The correct code is the following:-- -- DIVIDE is applied first, and then YTD -- DIVIDE ( CALCULATE ( [Sales Amount], DATESYTD ( 'Date'[Date] ) ), COUNTROWS ( 'Date' ) ) -- -- YTD is applied first, and then DIVIDE -- CALCULATE ( DIVIDE ( [Sales Amount], COUNTROWS ( 'Date' ) ), DATESYTD ( 'Date'[Date] ) )
-
Page 330: Small typo in Figure 10-16 description
The name of the first column reference in the description of Figure 10-16 should be “GlobalPct” instead of “GlocalPct”.
-
Page 332: Missing final “s” in SelectedCustomers variable name
In the first line of the second paragraph, the SelectedCustomers variable is missing the final “s”.
-
Page 398: Incorrect comment to code sample
The following text in the first paragraph should be removed: “In the previous query, if you define CategoriesSales before MinimumAmount or MaximumAmount, the result is a syntax error: The expression of CategoriesSales references two variables not yet defined.” This comment was made with a previous version of the code sample that created a dependency on variables. Moreover, the dependency between variables does not apply to code in the DEFINE section, but only to VAR/RETURN definitions.
This is a sample code that would have such a dependence, the highlighted lines reference variables not yet defined:
EVALUATE VAR CategoriesSales = FILTER ( ADDCOLUMNS ( SUMMARIZE ( Sales, 'Product'[Category] ), "CategoryAmount", [Sales Amount] ), AND ( [CategoryAmount] >= MinimumAmount, [CategoryAmount] <= MaximumAmount ) ) VAR MinimumAmount = 2000000 VAR MaximumAmount = 8000000 RETURN CategoriesSales ORDER BY [CategoryAmount]
-
Page 405: ROLLUPADDISSUBTOTAL misspelled
The first statement in the second paragraph mentions ROLLUPADDSUBTOTAL instead of ROLLUPADDISSUBTOTAL.
The correct statement is: “SUMMARIZECOLUMNS offers the option of computing subtotals too, using both ROLLUPADDISSUBTOTAL and ROLLUPGROUP.” -
Page 422: Remove comma from last argument of SUMMARIZE
The line 7 of the last code sample must not have the final comma. The right code is the following:
EVALUATE ADDCOLUMNS ( SUMMARIZE ( Sales, 'Date'[Calendar Year], 'Date'[Month], 'Date'[Month Number] ), "Amt", AVERAGEX ( RELATEDTABLE ( Sales ), Sales[Quantity] * Sales[Net Price] ) ) ORDER BY 'Date'[Calendar Year], 'Date'[Month Number]
-
Page 424: Replace “categories” with “brands”
In the fifth paragraph, the sentence:
“Consider the requirement to compute the average sales per category and to then build a report showing the categories below, around, and above the average…”
should read
“Consider the requirement to compute the average sales per brand and to then build a report showing the brands below, around, and above the average…”
-
Page 438: Replace “Net Price” with “Unit Price”
The column “Net Price” in the Sales table of Figure 14-1 should be named “Unit Price”.
-
Page 451: Missing comma in measure declaration
A colon is missing in the first line of the last code block on the page. The right code is the following:
Delivered Amount := CALCULATE ( [Sales Amount], CALCULATETABLE ( Sales, USERELATIONSHIP ( Sales[Delivery Date], 'Date'[Date] ) ) )
-
Page 463: ALLCROSSFILTERED is not a table function
ALLCROSSFILTERED can only be used as a filter modifier and not as a table function. In the last paragraph, the sentence “All these functions can be used either as table functions or as CALCULATE modifiers.” should exclude ALLCROSSFILTERED. Replace the sentence with “All these functions (besides ALLCROSSFILTERED) can be used either as table functions or as CALCULATE modifiers.”
-
Page 464: Corrections in Table 14-5
The Table function description should clarify that when the argument is a table, the result include duplicated rows. This is the correct description in the column “Table function” for three functions:
- ALL: Returns all the distinct values of a column or all the rows of a table.
- ALLNOBLANKROW: Returns all the distinct values of a column or all the rows of a table, ignoring the blank row added for invalid relationships.
- ALLSELECTED: Returns the distinct values of a column or all the rows of a table, as they are visible in the last shadow filter context.
-
Page 467: Remove square brackets from temporary column name / 1
Line 13 of the sample code should not have square brackets in the name definition.
The right code is the following:DEFINE MEASURE Sales[Sales Amount] = SUMX ( Sales, Sales[Quantity] * Sales[Net Price] ) EVALUATE VAR NonBlueColors = FILTER ( ALL ( 'Product'[Color] ), 'Product'[Color] <> "Blue" ) VAR AddC2 = ADDCOLUMNS ( NonBlueColors, "C2", 'Product'[Color] ) VAR SelectOnlyC2 = SELECTCOLUMNS ( AddC2, "C2", [C2] ) VAR Result = ADDCOLUMNS ( SelectOnlyC2, "Sales Amount", [Sales Amount] ) RETURN Result ORDER BY [C2]
-
Page 468: Remove square brackets from temporary column name / 2
Line 13 of the sample code should not have square brackets in the name definition.
The right code is the following:DEFINE MEASURE Sales[Sales Amount] = SUMX ( Sales, Sales[Quantity] * Sales[Net Price] ) EVALUATE VAR NonBlueColors = FILTER ( ALL ( 'Product'[Color] ), 'Product'[Color] <> "Blue" ) VAR AddC2 = ADDCOLUMNS ( NonBlueColors, "C2", 'Product'[Color] ) VAR SelectOnlyC2 = SELECTCOLUMNS ( AddC2, "C2", [C2] ) VAR TreatAsColor = TREATAS ( SelectOnlyC2, 'Product'[Color] ) VAR Result = ADDCOLUMNS ( TreatAsColor, "Sales Amount", [Sales Amount] ) RETURN Result ORDER BY 'Product'[Color]
-
Page 474: The word “Configuration” should be neither italics nor capitalized
The word “Configuration” in the page should not be in italics nor capitalized.
The Figure 15-2 description should read:
This is the configuration table for the price ranges.
In the following paragraph, the sentence should read
“As was the case in the previous example, it is not possible to create a direct relationship between the Sales table and the configuration table.”
-
Page 477: Mismatch in table names
In the last paragraph, there is a Sales table name that should be PriceRanges. The sentence
“PriceRanges depends on Sales[PriceRangeKey] for the blank row, whereas Sales[PriceRangeKey] depends on Sales because of the formula.”
should read
“PriceRanges depends on Sales[PriceRangeKey] for the blank row, whereas Sales[PriceRangeKey] depends on PriceRanges because of the formula.”
-
Page 491: Replace Brand with Sales
In the last paragraph, replace the “Brand” table name with “Sales” in the first sentence. Instead of “The reason for this is that the filter context on Product[Brand] affects Sales because of the one-to-many relationship between Product and Brand.” the correct sentence is “The reason for this is that the filter context on Product[Brand] affects Sales because of the one-to-many relationship between Product and Sales.”
-
Page 503: Fix figure reference in first paragraph
In the first paragraph, the reference to Figure 15-21 must be changed to Figure 15-22. The right sentence should be “This does require using the columns from the CountryRegions and Brands tables in the report, which will appear as in Figure 15-21.”
-
Page 505: Confusing mention of Figure 15-24
In the third paragraph, remove the reference to figure 15-24. The paragraph should read:
“Nevertheless, a trap lies in this model that our reader must be aware of. Because the relationship is weak, neither of the two tables will contain the blank row in case the relationship is invalid. In other words, if Budget contains a country or a brand that is not present in Customer or in Product, then its values will be hidden, as is the case for the model in Figure 15-24.”
-
Page 509: Change in last paragraph
In the last paragraph, the reference to “Blue company” should be replaced by a reference to products with blu colors.
The sentence:“… For instance, The Phone Company does not have any product that is blue, as shown in Figure 15-29. Thus, the Product[Brand] column is cross-filtered by Product[Color], and it shows all the brands except for The Phone Company. When the filter context is moved to the Budget table, the operation occurs at the Brand granularity. Consequently, the Budget table is filtered showing all brands
but The Blue Company”Should become:
“… For instance, The Phone Company does not have any product that is blue, as shown in Figure 15-29. Thus, the Product[Brand] column is cross-filtered by Product[Color], and it shows all the brands except for The Phone Company. When the filter context is moved to the Budget table, the operation occurs at the Brand granularity. Consequently, the Budget table is filtered showing all brands containing at least one blue product.”
-
Page 510: Change in first paragraph
In the first paragraph, the reference to “Blue company” should be replaced by a reference to products with blu colors.
“The value shown is the sum of all brands
except for The Blue Company. While traversing the relationship, the information about the color has been lost.”Should read:
“The value shown is the sum of all brands containing at least one blue product. While traversing the relationship, the information about the color has been lost.”
-
Page 516: Changed paragraph after Figure 15-37
The first paragraph of this page describes a different version of the model described in Figure 15-37 and it should be replaced by the following paragraph:
Focus on the Date table. Date filters Sales through the only active relationship (Date[Date] to Sales[Date]). There is one active relationship between Date and Sales. There is also a relationship between Date and Customer, based on Customer[FirstSale] that must be inactive. If this latter relationship were activated, then the filter from Date could reach Sales following two paths, making the model ambiguous. Thus, this model works just fine because it only uses the active relationships.
-
Page 535: Missing plural in Figure 16-9 description
The description of Figure 16-9 is missing the plural for the OpenStoresAmt measure reference.
The right description is: “OpenStoresAmt only returns a value if the store has been open in all selected years.” -
Page 551: Wrong separator in schematic representation of physical memory layout
Wrong row separator (“,” instead of “|”) before the last row in the schematic representation of the physical memory layout of a row store.
The correct representation is the following:ID,Name,Color,Unit Price|1,Camcorder,Red,112.25|2,Camera,Red,97.50|3,Smartphone, White,100.00|4,Console,Black,112.25|5,TV,Blue,1,240.85|6,CD,Red,39.99|7, Touch screen,Blue,45.12|8,PDA,Black,120.25|9,Keyboard,Black,120.50
-
Page 570: Replace earlier with smaller
In the last paragraph, replace “earlier materialization” with “smaller materialization.
The sentence:
“The latter query has a materialization of 6,290 rows, even though there is only one row in the result. The two queries are similar: a table is evaluated and then its rows are counted. The reason why the former has
an earliermaterialization is because it involves a single column,…”Should read:
“The latter query has a materialization of 6,290 rows, even though there is only one row in the result. The two queries are similar: a table is evaluated and then its rows are counted. The reason why the former has a smaller materialization is because it involves a single column,…”
-
Page 594: Change “truncate” to “round” in second code block
Change “truncate” to “round” in the comments of the second code block on the page.
The right comment is:-- Round to 5 minutes -- change 5 to 15 to round to 15 minutes -- change 5 to 60 to round to the hour
-
Page 628: Wrong phrasing
In the paragraph after the note section, the sentence:
“The WHERE condition might include a test with more than one value. For example, consider a small variation of the previous query that sums
either the quantity or the saleswith a unit price equal to 16 or 42. You see this in the following DAX query:”Should read:
“The WHERE condition might include a test with more than one value. For example, consider a small variation of the previous query that sums the quantity of sales with a unit price equal to either 16 or 42. You see this in the following DAX query:”
-
Page 629: Grammar error (be not / not be)
In the first paragraph, the position of “not” is incorrect. The last sentence in the first paragraph should be “For example, if neither 16 nor 42 existed in the Sales table, the previous xmSQL query could very well not be invoked at all from the FE or it would become something like”
-
Page 655: Join executed within SE, not FE
In the first paragraph after the code snipped, the sentences “This way, there is no need to materialize more data for the SE. Indeed, the join is executed within the FE…” should be “This way, there is no need to materialize more data for the FE. Indeed, the join is executed within the SE…” because the storage engine used more efficiently when TREATAS compared to using INTERSECT.
-
Page 677: Correction to description of Figure 20-21
The description of Figure 20-21 must finish using “by brand” instead of “by country”. The correct complete description is:
FIGURE 20-21 Query Plan pane running the query for the Cashback (slow) measure reported by brand. -
Page 679: Correction to description of Figure 20-23
The description of Figure 20-23 must finish using “by customer” instead of “by brand”. The correct complete description is:
FIGURE 20-23 Fam. Sales reported by customer. -
Page 681: Correction to description of Figure 20-25
The description of Figure 20-25 must finish start with “Query Plan” instead of “Server Timings”. The correct complete description is:
FIGURE 20-25 Query Plan running the query for the Fam. Sales (slow) measure reported by customer. -
Page 690: Change column name from unit Price to Net Price
In the second paragraph change the column reference from Unit Price to Net Price. The right sentence is “For example, consider the following query where the Rounded Sales measure computes its result
rounding Net Price to the nearest integer.”