Back to School - Transform class schedule to PivotTable (Power Query)
This article has moved here.
Comments
- Anonymous
September 14, 2015
This post is the first in a series of posts that will walk you through one of the coolest data transformation - Anonymous
September 14, 2015
nice - Anonymous
September 15, 2015
Very cool! - Anonymous
September 15, 2015
Gil, nice post. I think you should make one change though. There's no reason here to create a blank query, then enter custom M code to get at the data. Just select any cell in the initial table and go to Data --> Get & Transform --> From Table. It will automatically load the table, promote the headers and change the column types for you. - Anonymous
September 15, 2015
Gil, just to clarify here. You still need to create the named range in order to preserve your merged cells. Providing that the name range is selected in full, however, you can simply use From Table to pull it in. - Anonymous
September 15, 2015
Thank you, Ken.
You are right. I edited the post, with your recommendation, to "From Table" instead of "Blank Query". Note that after the definition of the name range, selecting a single cell is not be sufficient. Excel doesn't automatically recognize the entire range. But if we select the entire range, we can use "From Table". - Anonymous
September 27, 2015
This is the third post in the series The Definitive Guide to Unpivot with Power Query in Excel . In this - Anonymous
September 27, 2015
Next post in The Definitive Guide to Unpivot with Power Query in Excel is ready:http://blogs.technet.com/b/gilraviv/archive/2015/09/27/transform-nested-table-to-pivottable.aspx - Anonymous
January 15, 2016
Gil, advanced code could be much easier, basic query with next step - Grouping row, here is code:
let
Source = Excel.CurrentWorkbook(){[Name="ClassSchedule"]}[Content],
#"Promoted Headers" = Table.PromoteHeaders(Source),
#"Changed Type1" = Table.TransformColumnTypes(#"Promoted Headers",{{"Time", type time}, {"Mon", type text}, {"Tue", type text}, {"Wed", type text}, {"Thu", type text}, {"Fri", type text}}),
#"Filled Down" = Table.FillDown(#"Changed Type1",{"Mon", "Tue", "Wed", "Thu", "Fri"}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Filled Down", {"Time"}, "Attribute", "Value"),
#"Filtered Rows" = Table.SelectRows(#"Unpivoted Other Columns", each ([Value] <> "none")),
#"Renamed Columns" = Table.RenameColumns(#"Filtered Rows",{{"Attribute", "Day of Week"}}),
#"Added Custom" = Table.AddColumn(#"Renamed Columns", "Custom", each Record.FromList( Lines.FromText([Value]), {"Class", "Teacher"})),
#"Expanded Custom" = Table.ExpandRecordColumn(#"Added Custom", "Custom", {"Class", "Teacher"}, {"Class", "Teacher"}),
#"Added Custom1" = Table.AddColumn(#"Expanded Custom", "Custom", each 30),
#"Changed Type" = Table.TransformColumnTypes(#"Added Custom1",{{"Custom", Int64.Type}}),
#"Renamed Columns1" = Table.RenameColumns(#"Changed Type",{{"Custom", "Duration (Minutes)"}}),
#"Removed Columns" = Table.RemoveColumns(#"Renamed Columns1",{"Value"}),
#"Grouped Rows" = Table.Group(#"Removed Columns", {"Day of Week", "Class", "Teacher"}, {{"Count", each List.Sum([#"Duration (Minutes)"]), type number}, {"Column", each List.Min([Time]), type time}}),
#"Reordered Columns" = Table.ReorderColumns(#"Grouped Rows",{"Day of Week", "Column", "Class", "Teacher", "Count"}),
#"Renamed Columns2" = Table.RenameColumns(#"Reordered Columns",{{"Column", "Start Time"}, {"Count", "Duration (Minutes)"}})
in
#"Renamed Columns2"