Various resources can be reserved in Azure, whereby use is guaranteed for 1 or 3 years. This can reduce the price of these resources by up to 72%. In the portal you can see these reduced costs for the reservations:

Unfortunately, the costs cannot be retrieved via PowerShell (Get-AzConsumptionUsageDetail). The costs can be determined with the Query-API. Unfortunately, there is no filter option to skip empty cost lines. Hence the following script that retrieves all reservations and filters out unnecessary information:

[CmdletBinding()]
[OutputType([PSObject])]
param (
  [parameter(Mandatory = $true)]
  [ValidateNotNullOrEmpty()]
  [String]
  $ManagementGroupID,

  [parameter(Mandatory = $false)]
  [ValidateNotNullOrEmpty()]
  [String]
  $StartDate = (Get-Date).Date.ToString("yyyy-MM-01T00:00:00+00:00"),

  [parameter(Mandatory = $false)]
  [ValidateNotNullOrEmpty()]
  [String]
  $EndDate = (Get-Date).Date.AddMonths(1).ToString("yyyy-MM-01T00:00:00+00:00")
)

$body = @{
    "type"="ActualCost"
    "dataSet"=@{
        "granularity"= "Daily"
        "aggregation"= @{
            "totalCost"= @{
                "name"= "Cost"
                "function"= "Sum"
            }
        }
        "sorting"= @(
            @{
                "direction"= "ascending"
                "name"= "UsageDate"
            }
        )
        "grouping"= @(
            @{
                "type"= "Dimension"
                "name"= "ReservationName"
            }
        )
    }
    "timeframe"= "Custom"
    "timePeriod"= @{
        "from"= "$StartDate"
        "to"= "$EndDate"
    }
}

$url = "https://management.azure.com/providers/Microsoft.Management/managementGroups/$ManagementGroupID/providers/Microsoft.CostManagement/query?api-version=2021-10-01"

$ris = @()
while($url){
    $costs = Invoke-RestMethod `
        -Method Post `
        -ContentType "application/json; charset=utf-8" `
        -Authentication Bearer `
        -Token (ConvertTo-SecureString -String (Get-AzAccessToken -ResourceUrl "https://management.azure.com").token -AsPlainText) `
        -Body (ConvertTo-Json $body -Depth 10) `
        -Uri $url

    $rows = $costs.properties.rows
    foreach($row in $rows){
        if($row[0] -ne 0 -and $row[2]){
            $ri = [pscustomobject] [ordered] @{
                Cost = $row[0]
                UsageDate = $row[1]
                ReservationName = $row[2]
                Currency = $row[3]
            }
            $ris += $ri
        }
    }
    $url = $costs.properties.nextLink
}

return $ris

The call is made with the ID of a ManagementGroup under which all reservations are determined (usually Tenant Root Group). The determination is then made for the current month (line 1). Optionally, start or end date can also be specified (line 12):

$ris = .\Get-ReservationCosts.ps1 -ManagementGroupID <GUID>
$ris | Measure-Object -Property 'Cost' -Sum

Count             : 61
Average           : 
Sum               : 10054,28
Maximum           : 
Minimum           : 
StandardDeviation : 
Property          : Cost

$ris = .\Get-ReservationCosts.ps1 -ManagementGroupID <GUID> -StartDate "2022-08-01T00:00:00+00:00" -EndDate "2022-08-31T23:59:59+00:00"
$ris | Measure-Object -Property 'Cost' -Sum   

Count             : 86
Average           : 
Sum               : 22886,3
Maximum           : 
Minimum           : 
StandardDeviation : 
Property          : Cost