About the Author |
|
xiii | |
About the Technical Reviewer |
|
xv | |
Acknowledgments |
|
xvii | |
Introduction |
|
xix | |
|
Chapter 1 Discovering and Loading Data with Power BI Desktop |
|
|
1 | (20) |
|
|
2 | (5) |
|
|
7 | (1) |
|
|
8 | (2) |
|
Searching for Usable Data |
|
|
10 | (1) |
|
|
11 | (1) |
|
|
11 | (1) |
|
The Navigator Data Preview |
|
|
12 | (1) |
|
|
13 | (1) |
|
|
14 | (2) |
|
The Power B1 Desktop Screen |
|
|
16 | (1) |
|
|
16 | (3) |
|
|
19 | (2) |
|
Chapter 2 Discovering and Loading File-Based Data with Power BI Desktop |
|
|
21 | (22) |
|
|
21 | (2) |
|
|
23 | (1) |
|
|
23 | (6) |
|
|
29 | (2) |
|
|
31 | (1) |
|
|
32 | (2) |
|
|
34 | (3) |
|
Microsoft Access Databases |
|
|
37 | (2) |
|
|
39 | (2) |
|
|
41 | (1) |
|
|
41 | (2) |
|
Chapter 3 Loading Data from Databases and Data Warehouses |
|
|
43 | (40) |
|
|
44 | (3) |
|
|
47 | (5) |
|
Automatically Loading Related Tables |
|
|
52 | (1) |
|
|
52 | (4) |
|
|
56 | (7) |
|
|
63 | (5) |
|
Other Relational Databases |
|
|
68 | (3) |
|
Microsoft SQL Server Analysis Services Data Sources |
|
|
71 | (3) |
|
Analysis Services Cube Tools |
|
|
74 | (3) |
|
SSAS Tabular Data Warehouses |
|
|
77 | (3) |
|
Import or Connect Live/DirectQuery |
|
|
80 | (1) |
|
Other Database Connections |
|
|
80 | (1) |
|
|
80 | (3) |
|
Chapter 4 DirectQuery and Connect Live |
|
|
83 | (26) |
|
DirectQuery and Connect Live |
|
|
83 | (3) |
|
Microsoft SQL Server Data |
|
|
86 | (7) |
|
SQL Server Analysis Services Dimensional Data |
|
|
93 | (3) |
|
Microsoft SQL Server Analysis Services Tabular Data Sources |
|
|
96 | (3) |
|
DirectQuery with Non-Microsoft Databases |
|
|
99 | (1) |
|
DirectQuery and In-Memory Tables |
|
|
100 | (1) |
|
DirectQuery and Refreshing the Data |
|
|
101 | (1) |
|
|
101 | (1) |
|
|
102 | (3) |
|
|
105 | (3) |
|
|
108 | (1) |
|
Chapter 5 Loading Data from the Web and the Cloud |
|
|
109 | (46) |
|
|
110 | (1) |
|
|
110 | (1) |
|
|
110 | (2) |
|
|
112 | (1) |
|
|
113 | (3) |
|
|
116 | (1) |
|
|
117 | (1) |
|
|
118 | (1) |
|
Loading Data from Salesforce Objects |
|
|
118 | (7) |
|
|
125 | (1) |
|
|
126 | (5) |
|
|
131 | (3) |
|
|
134 | (1) |
|
|
135 | (1) |
|
|
136 | (6) |
|
|
142 | (3) |
|
Connecting to SQL Server on an Azure Virtual Machine |
|
|
145 | (2) |
|
|
147 | (4) |
|
|
151 | (3) |
|
|
154 | (1) |
|
|
154 | (1) |
|
Chapter 6 Loading Data from Other Data Sources |
|
|
155 | (32) |
|
|
155 | (1) |
|
|
156 | (2) |
|
|
158 | (3) |
|
|
161 | (4) |
|
|
165 | (1) |
|
Python Scripts to Load Data |
|
|
166 | (3) |
|
|
169 | (1) |
|
|
170 | (1) |
|
|
171 | (10) |
|
|
181 | (1) |
|
Refreshing the Entire Data in the Power BI Desktop In-Memory Model |
|
|
181 | (1) |
|
Refreshing an Individual Table |
|
|
182 | (1) |
|
|
183 | (2) |
|
|
185 | (2) |
|
|
187 | (26) |
|
|
188 | (1) |
|
Editing Data After a Data Load |
|
|
189 | (3) |
|
Transforming Data Before Loading |
|
|
192 | (2) |
|
|
194 | (1) |
|
|
195 | (2) |
|
|
197 | (1) |
|
|
197 | (8) |
|
|
205 | (2) |
|
|
207 | (1) |
|
|
208 | (1) |
|
|
208 | (1) |
|
Power Query Context Menus |
|
|
209 | (2) |
|
|
211 | (2) |
|
Chapter 8 Structuring Data |
|
|
213 | (42) |
|
|
214 | (1) |
|
|
215 | (1) |
|
|
215 | (2) |
|
|
217 | (1) |
|
|
218 | (2) |
|
|
220 | (3) |
|
Going to a Specific Column |
|
|
223 | (2) |
|
|
225 | (1) |
|
|
226 | (4) |
|
Removing Duplicate Records |
|
|
230 | (1) |
|
|
231 | (2) |
|
|
233 | (1) |
|
|
233 | (1) |
|
|
234 | (1) |
|
Selecting Specific Values |
|
|
235 | (1) |
|
Finding Elements in the Filter List |
|
|
236 | (2) |
|
|
238 | (1) |
|
|
238 | (1) |
|
Filtering Date and Time Ranges |
|
|
239 | (2) |
|
|
241 | (2) |
|
Applying Advanced Filters |
|
|
243 | (2) |
|
Excluding Rows Where a Value Is Missing |
|
|
245 | (1) |
|
|
246 | (1) |
|
|
247 | (2) |
|
|
249 | (3) |
|
Saving Changes in Power Query |
|
|
252 | (1) |
|
|
252 | (1) |
|
|
253 | (2) |
|
|
255 | (38) |
|
|
256 | (1) |
|
|
256 | (5) |
|
Aggregating Data During a Merge Operation |
|
|
261 | (4) |
|
|
265 | (1) |
|
Joining on Multiple Columns |
|
|
266 | (2) |
|
|
268 | (1) |
|
|
269 | (1) |
|
|
270 | (1) |
|
Preparing Datasets for Joins |
|
|
271 | (1) |
|
Correct and Incorrect Joins |
|
|
271 | (1) |
|
|
272 | (2) |
|
|
274 | (1) |
|
Adding the Contents of One Query to Another |
|
|
274 | (3) |
|
Appending the Contents of Multiple Queries |
|
|
277 | (2) |
|
Changing the Data Structure |
|
|
279 | (1) |
|
|
279 | (3) |
|
|
282 | (2) |
|
Transposing Rows and Columns |
|
|
284 | (1) |
|
|
284 | (1) |
|
|
285 | (1) |
|
|
285 | (1) |
|
|
286 | (2) |
|
Profiling the Entire Dataset |
|
|
288 | (1) |
|
|
289 | (2) |
|
Data Transformation Approaches |
|
|
291 | (1) |
|
|
291 | (2) |
|
Chapter 10 Data Cleansing |
|
|
293 | (28) |
|
Using the First Row As Headers |
|
|
294 | (1) |
|
|
295 | (3) |
|
|
298 | (1) |
|
|
298 | (2) |
|
|
300 | (1) |
|
|
301 | (1) |
|
|
302 | (3) |
|
Transforming Column Contents |
|
|
305 | (1) |
|
|
305 | (2) |
|
Adding a Prefix or a Suffix |
|
|
307 | (1) |
|
Removing Leading and Trailing Spaces |
|
|
307 | (1) |
|
Removing Nonprinting Characters |
|
|
308 | (1) |
|
|
309 | (10) |
|
|
319 | (2) |
|
Chapter 11 Data Transformation |
|
|
321 | (26) |
|
|
322 | (4) |
|
Extracting Part of a Column's Contents |
|
|
326 | (1) |
|
|
327 | (3) |
|
|
330 | (1) |
|
|
330 | (1) |
|
Splitting Column by a Delimiter |
|
|
331 | (3) |
|
Advanced Options for Delimiter Split |
|
|
334 | (1) |
|
Splitting Columns by Number of Characters |
|
|
335 | (2) |
|
Splitting Columns by Character Switch |
|
|
337 | (1) |
|
|
337 | (2) |
|
Creating Columns from Examples |
|
|
339 | (2) |
|
Adding Conditional Columns |
|
|
341 | (3) |
|
|
344 | (1) |
|
|
345 | (2) |
|
Chapter 12 Complex Data Structures |
|
|
347 | (40) |
|
Adding Multiple Files from a Source Folder |
|
|
348 | (3) |
|
Filtering Source Files in a Folder |
|
|
351 | (4) |
|
Displaying and Filtering File Attributes |
|
|
355 | (2) |
|
The List Tools Transform Ribbon |
|
|
357 | (1) |
|
Parsing XML Data from a Column |
|
|
358 | (3) |
|
Parsing JSON Data from a Column |
|
|
361 | (2) |
|
|
363 | (2) |
|
|
365 | (4) |
|
|
369 | (1) |
|
Using Python Scripts to Modify Data |
|
|
370 | (3) |
|
Using R Scripts to Modify Data |
|
|
373 | (2) |
|
Convert a Column to a List |
|
|
375 | (1) |
|
|
376 | (4) |
|
|
380 | (3) |
|
|
383 | (1) |
|
Copying Data from Power Query |
|
|
384 | (1) |
|
|
385 | (2) |
|
Chapter 13 Organizing, Managing, and Parameterizing Queries |
|
|
387 | (46) |
|
Managing the Transformation Process |
|
|
388 | (1) |
|
|
389 | (1) |
|
|
390 | (1) |
|
Deleting a Step or a Series of Steps |
|
|
390 | (2) |
|
Modifying an Existing Step |
|
|
392 | (3) |
|
|
395 | (1) |
|
Altering Process Step Sequencing |
|
|
395 | (1) |
|
An Approach to Sequencing |
|
|
395 | (2) |
|
|
397 | (1) |
|
|
397 | (1) |
|
|
398 | (1) |
|
|
398 | (1) |
|
|
399 | (3) |
|
|
402 | (1) |
|
|
402 | (3) |
|
|
405 | (1) |
|
Adding a Column As a New Query |
|
|
406 | (2) |
|
|
408 | (1) |
|
|
409 | (1) |
|
|
410 | (1) |
|
|
410 | (1) |
|
Creating a Simple Parameter |
|
|
411 | (2) |
|
Creating a Set of Parameter Values |
|
|
413 | (3) |
|
Creating a Query-Based Parameter |
|
|
416 | (3) |
|
|
419 | (1) |
|
Applying a Parameter When Filtering Records |
|
|
420 | (2) |
|
Modifying the Current Value of a Parameter |
|
|
422 | (1) |
|
Applying a Parameter in a Search and Replace |
|
|
423 | (1) |
|
Applying a Parameter to a Data Source |
|
|
424 | (3) |
|
Other Uses for Parameters |
|
|
427 | (1) |
|
Using Parameters in the Data Source Step |
|
|
428 | (1) |
|
Applying a Parameter to a SQL Query |
|
|
429 | (2) |
|
|
431 | (1) |
|
Power BI Templates with Parameters |
|
|
431 | (1) |
|
|
432 | (1) |
|
Chapter 14 The M Language |
|
|
433 | (42) |
|
|
434 | (1) |
|
M and the Power Query Editor |
|
|
435 | (1) |
|
Modifying the Code for a Step |
|
|
436 | (2) |
|
|
438 | (1) |
|
Writing M by Adding Custom Columns |
|
|
439 | (2) |
|
|
441 | (1) |
|
Expressions in the Advanced Editor |
|
|
442 | (1) |
|
|
443 | (1) |
|
Modifying M in the Advanced Editor |
|
|
444 | (1) |
|
|
445 | (1) |
|
|
446 | (1) |
|
|
447 | (1) |
|
|
448 | (2) |
|
|
450 | (1) |
|
|
450 | (2) |
|
|
452 | (2) |
|
|
454 | (1) |
|
|
454 | (1) |
|
|
455 | (1) |
|
|
456 | (2) |
|
|
458 | (1) |
|
Defining Your Own Variables in M |
|
|
458 | (1) |
|
|
459 | (1) |
|
|
460 | (2) |
|
|
462 | (1) |
|
|
462 | (2) |
|
Generating Sequences Using Lists |
|
|
464 | (1) |
|
Accessing Values from a List |
|
|
465 | (1) |
|
|
465 | (1) |
|
|
466 | (2) |
|
|
468 | (2) |
|
|
470 | (1) |
|
|
470 | (2) |
|
Adding Comments to M Code |
|
|
472 | (1) |
|
|
473 | (1) |
|
|
473 | (1) |
|
|
473 | (2) |
Appendix A Sample Data |
|
475 | (1) |
Sample Data |
|
475 | (1) |
Downloading the Sample Data |
|
475 | (2) |
Index |
|
477 | |