Table.Pivot Function in Power Query
The Table.Pivot function in Power Query is used to rotate a column's unique values into separate columns—each acting like a field in a new table layout.
Syntax
Table.Pivot( table as table, pivotValues as list, attributeColumn as text, valueColumn as text, optional aggregationFunction as nullable function ) as table
The function has the following parameters:
- table: Your input table
 - pivotValues: List of values in attributeColumn that should become column headers
 - attributeColumn: Column containing the values you want to pivot into headers
 - valueColumn: Column whose values we want under the new pivoted columns
 - aggregationFunction: It is an optional parameter. Used if multiple values exist for the same combination (like List.Max, List.Min, List.Sum)
 
Example: Sum of Sales by Month
Let’s say we have sales data by region and month:
Input
| Region | Month | Sales | 
|---|---|---|
| East | Jan | 100 | 
| East | Feb | 120 | 
| West | Jan | 90 | 
| West | Jan | 60 | 
| West | Feb | 110 | 
We want months ("Jan", "Feb") to become columns, with the sum of sales per region.
Power Query M
Table.Pivot(
    Table.FromRecords({
        [Region = "East", Month = "Jan", Sales = 100],
        [Region = "East", Month = "Feb", Sales = 120],
        [Region = "West", Month = "Jan", Sales = 90],
        [Region = "West", Month = "Jan", Sales = 60],
        [Region = "West", Month = "Feb", Sales = 110]
    }),
    {"Jan", "Feb"},
    "Month",
    "Sales",
    List.Sum
)      The output of the above code is shown below:
| Region | Jan | Feb | 
|---|---|---|
| East | 100 | 120 | 
| West | 150 | 110 | 
Example: Employee Attendance Tracker
Input Table
| Employee | Date | Status | 
|---|---|---|
| Alice | 01-Apr-25 | Present | 
| Alice | 02-Apr-25 | Absent | 
| Bob | 01-Apr-25 | Present | 
| Bob | 02-Apr-25 | Present | 
Goal
Pivot Date into columns to show attendance status per employee.
Power Query M
Table.Pivot(
    Table.FromRecords({
        [Employee = "Alice", Date = "01-Apr-25", Status = "Present"],
        [Employee = "Alice", Date = "02-Apr-25", Status = "Absent"],
        [Employee = "Bob", Date = "01-Apr-25", Status = "Present"],
        [Employee = "Bob", Date = "02-Apr-25", Status = "Present"]
    }),
    {"01-Apr-25", "02-Apr-25"},
    "Date",
    "Status"
)     The output of the above code is shown below:
| Employee | 01-Apr-25 | 02-Apr-25 | 
|---|---|---|
| Alice | Present | Absent | 
| Bob | Present | Present | 
Example: Departmental Expenses by Category
Input Table
| Dept | Category | Amount | 
|---|---|---|
| HR | Travel | 2000 | 
| HR | Supplies | 500 | 
| Finance | Travel | 3000 | 
| Finance | Software | 700 | 
| HR | Travel | 1500 | 
Goal
Pivot Category into columns, aggregate Amount using List.Sum.
Power Query M
Table.Pivot(
    Table.FromRecords({
        [Dept = "HR", Category = "Travel", Amount = 2000],
        [Dept = "HR", Category = "Supplies", Amount = 500],
        [Dept = "Finance", Category = "Travel", Amount = 3000],
        [Dept = "Finance", Category = "Software", Amount = 700],
        [Dept = "HR", Category = "Travel", Amount = 1500]
    }),
    {"Travel", "Supplies", "Software"},
    "Category",
    "Amount",
    List.Sum
)     The output of the above code is shown below:
| Dept | Travel | Supplies | Software | 
|---|---|---|---|
| HR | 3500 | 500 | null | 
| Finance | 3000 | null | 700 | 
Tips for Using Table.Pivot
- We want to transform rows into columns based on a value.
 - Always check for duplicates — If there are multiple rows with the same key-attribute pair, we will need an aggregation function (like List.Sum, List.Max, etc.).
 - Use Table.Distinct before Table.Pivot if you're sure there should be only one value per key-attribute.
 - Make sure your pivotValues list includes all possible values — if missing, some columns won’t appear.