Freigeben über


Aggregieren von Daten mithilfe von OData

Verwenden Sie die OData-Option $apply , um Ihre Daten in Microsoft Dataverse zu aggregieren und zu gruppieren. Mit dieser Abfrageoption können Sie Berechnungen wie Summe, Anzahl, Mittelwert und Gruppierungsvorgänge für Sammlungen von bis zu 50.000 Datensätzen ausführen.

Die Aggregatfunktionen funktionieren mit einer Sammlung von bis zu 50.000 Datensätzen. Weitere Informationen zur Verwendung von Aggregatfunktionen mit Dataverse finden Sie unter "Aggregierte Daten mithilfe von FetchXml".

Weitere Informationen zur OData-Datenaggregation finden Sie in der OData-Erweiterung für die Datenaggregation, Version 4.0. Beachten Sie, dass Dataverse nur eine Teilmenge dieser Aggregatmethoden unterstützt.

Anmerkung

  • groupby mit Datum/Uhrzeit-Werten wird nicht unterstützt.

  • $orderby mit Aggregatwerten wird nicht unterstützt. Diese Einschränkung gibt den Fehler zurück: The query node SingleValueOpenPropertyAccess is not supported.

Beispiele

Die folgenden Beispiele zeigen, wie Aggregatfunktionen verwendet werden:

Diese Beispiele zeigen der Kürze halber nicht die vollständige Anfrage und Antwort.

Liste der einzigartigen Status in der Abfrage

GET accounts?$apply=groupby((statuscode))
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue"

Antworttext

{
    "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts",
    "value": [
        {
            "statuscode@OData.Community.Display.V1.FormattedValue": "Active",
            "statuscode": 1
        },
        {
            "statuscode@OData.Community.Display.V1.FormattedValue": "Inactive",
            "statuscode": 2
        }
    ]
}

Anzahl nach Statuswerten

GET accounts?$apply=groupby((statuscode),aggregate($count as count))
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue"

Antworttext

{
    "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts",
    "value": [
        {
            "statuscode@OData.Community.Display.V1.FormattedValue": "Active",
            "statuscode": 1,
            "count@OData.Community.Display.V1.FormattedValue": "8",
            "count": 8
        },
        {
            "statuscode@OData.Community.Display.V1.FormattedValue": "Inactive",
            "statuscode": 2,
            "count@OData.Community.Display.V1.FormattedValue": "1",
            "count": 1
        }
    ]
}

Summe der aggregierten Einnahmen

GET accounts?$apply=aggregate(revenue with sum as total)
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue"

Antworttext

{
    "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts",
    "value": [
        {
            "total@OData.Community.Display.V1.FormattedValue": "$440,000.00",
            "total": 440000.000000000
        }
    ]
}

Durchschnittlicher Umsatz basierend auf dem Status

GET accounts?$apply=groupby((statuscode),aggregate(revenue with average as averagevalue))
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue"

Antworttext

{
    "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts",
    "value": [
        {
            "statuscode@OData.Community.Display.V1.FormattedValue": "Active",
            "statuscode": 1,
            "averagevalue@OData.Community.Display.V1.FormattedValue": "$53,750.00",
            "averagevalue": 53750.000000000
        },
        {
            "statuscode@OData.Community.Display.V1.FormattedValue": "Inactive",
            "statuscode": 2,
            "averagevalue@OData.Community.Display.V1.FormattedValue": "$10,000.00",
            "averagevalue": 10000.000000000
        }
    ]
}

Durchschnittlicher Umsatz basierend auf dem Status

GET accounts?$apply=groupby((statuscode),aggregate(revenue with sum as total))
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue"

Antworttext

{
    "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts",
    "value": [
        {
            "statuscode@OData.Community.Display.V1.FormattedValue": "Active",
            "statuscode": 1,
            "total@OData.Community.Display.V1.FormattedValue": "$430,000.00",
            "total": 430000.000000000
        },
        {
            "statuscode@OData.Community.Display.V1.FormattedValue": "Inactive",
            "statuscode": 2,
            "total@OData.Community.Display.V1.FormattedValue": "$10,000.00",
            "total": 10000.000000000
        }
    ]
}

Gesamter Kontoumsatz nach primärem Kontaktnamen

GET accounts?$apply=groupby((primarycontactid/fullname),aggregate(revenue with sum as total))
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue"

Antworttext

{
    "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts",
    "value": [
        {
            "total@OData.Community.Display.V1.FormattedValue": "$10,000.00",
            "total": 10000.000000000,
            "contact_fullname": "Jim Glynn (sample)"
        },
        {
            "total@OData.Community.Display.V1.FormattedValue": "$80,000.00",
            "total": 80000.000000000,
            "contact_fullname": "Maria Campbell (sample)"
        },
      ... <truncated for brevity>
      
    ]
}

Primäre Kontaktnamen für Konten in 'WA'.

GET accounts?$apply=filter(address1_stateorprovince eq 'WA')/groupby((primarycontactid/fullname))

Antworttext

{
    "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts",
    "value": [
        {
            "contact_fullname": "Rene Valdes (sample)"
        },
        {
            "contact_fullname": "Robert Lyon (sample)"
        },
        {
            "contact_fullname": "Scott Konersmann (sample)"
        }
    ]
}

Datum und Uhrzeit für den zuletzt erstellten Datensatz

GET accounts?$apply=aggregate(createdon with max as lastCreate)
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue"

Antworttext

{
    "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts",
    "value": [
        {
            "lastCreate@OData.Community.Display.V1.FormattedValue": "3/25/2023 10:42 AM",
            "lastCreate": "2023-03-25T17:42:47Z"
        }
    ]
}

Erstellungsdatum und -uhrzeit des ersten Datensatzes

GET accounts?$apply=aggregate(createdon with min as firstCreate)
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue"

Antworttext

{
    "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts",
    "value": [
        {
            "firstCreate@OData.Community.Display.V1.FormattedValue": "3/25/2023 10:42 AM",
            "firstCreate": "2023-03-25T17:42:46Z"
        }
    ]
}

Bestimmte Spaltenwerte

OData verfügt nicht über eine $distinct Abfrageoption, mit der Ergebnisse auf eindeutige Werte beschränkt werden können. Verwenden Sie stattdessen die $apply Systemabfrageoption mit der groupby Transformation. Diese Methode gibt für jede Eigenschaft unterschiedliche Werte zurück.

Anforderung:

GET [Organization URI]/api/data/v9.2/accounts?$apply=groupby((statecode,statuscode,accountcategorycode))
Accept: application/json  
OData-MaxVersion: 4.0  
OData-Version: 4.0
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue"

Antwort:

HTTP/1.1 200 OK  
Content-Type: application/json; odata.metadata=minimal  
OData-Version: 4.0  
Preference-Applied: odata.include-annotations="OData.Community.Display.V1.FormattedValue"

{
   "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#accounts",
   "value": [
      {
         "statuscode": 1,
         "statecode": 0
      },
      {
         "statuscode": 1,
         "statecode": 0,
         "accountcategorycode": 1
      },
      {
         "statuscode": 1,
         "statecode": 0,
         "accountcategorycode": 2
      },
      {
         "statuscode": 2,
         "statecode": 1
      }
   ]
}

Einschränkungen der OData-Aggregation

In diesem Abschnitt werden Funktionen beschrieben, die mithilfe der Aggregation mit FetchXml verfügbar sind, die derzeit nicht mit OData verfügbar sind.

Eindeutige Zahlen mit CountColumn erhalten

Sie können keine unterschiedliche Anzahl von Werten abrufen, indem Sie CountColumn mit OData verwenden. Erfahren Sie mehr über unterschiedliche Spaltenwerte mithilfe von FetchXml.

Zeitzone beim Gruppieren nach Datum

Die Gruppierung nach Teilen eines Datums verwendet immer UTC-Zeit, und es gibt keine Möglichkeit anzugeben, dass stattdessen die Zeitzone des Benutzers verwendet werden soll. Informationen zum Gruppieren nach Teilen eines Datums in FetchXml.

Zeilenaggregation

Wenn für eine Tabelle eine hierarchische Beziehung festgelegt ist, können Sie für die hierarchische Beziehung kein Zeilenaggregat in der Suchspalte zurückgeben. Erfahren Sie mehr über Zeilenaggregate mithilfe von FetchXml.

Limit pro Abfrage

Sie können kein konfigurierbares Aggregatlimit angeben. Erfahren Sie mehr über abfragespezifische Grenzwerte mithilfe von FetchXml.

Einschränkungen

Abfragen, doe aggregierte Werte zurückgeben, sind auf 50.000 Datensätze beschränkt. Diese Beschränkung hilft dabei, die Systemleistung und Zuverlässigkeit zu erhalten. Wenn die Filterkriterien in Ihrer Abfrage mehr als 50.000 Datensätze enthalten, wird die folgende Fehlermeldung angezeigt:

Nummer: -2147164125
Code: 8004E023
Meldung: AggregateQueryRecordLimit exceeded. Cannot perform this operation.
Client-Fehlermeldung: Die maximale Datensatzgrenze wird überschritten. Reduzieren Sie die Anzahl der Datensätze.

Um diesen Fehler zu vermeiden, fügen Sie entsprechende Filter zu Ihrer Abfrage hinzu, um sicherzustellen, dass nicht mehr als 50.000 Datensätzen ausgewertet werden. Führen Sie Ihre Abfrage dann mehrmals aus und kombinieren Sie die Ergebnisse. Geeignete Filter hängen von der Art Ihrer Daten ab, es kann sich jedoch auch um einen Datumsbereich oder eine Teilmenge von Werten in einer Auswahlspalte handeln.

Nächste Schritte,

Erfahren Sie, wie Sie Zeilen zählen.