Partager via


Agréger des données à l’aide d’OData

Utilisez l’option OData $apply pour agréger et regrouper vos données dans Microsoft Dataverse. Cette option de requête vous permet d’effectuer des calculs tels que la somme, le nombre, la moyenne et les opérations de regroupement sur les collections d’un maximum de 50 000 enregistrements.

Les fonctions d’agrégation fonctionnent avec une collection d’un maximum de 50 000 enregistrements. Pour plus d’informations sur l’utilisation des fonctionnalités d’agrégation avec Dataverse, consultez agréger des données à l’aide de FetchXml.

Pour plus d’informations sur l’agrégation de données OData, consultez l’extension OData pour l’agrégation de données version 4.0. Dataverse ne prend en charge qu’un sous-ensemble de ces méthodes d’agrégation.

Note

  • groupby avec les valeurs DateTime n’est pas prises en charge.

  • $orderby avec les valeurs d’agrégation ne sont pas prises en charge. Cette limitation retourne l’erreur : The query node SingleValueOpenPropertyAccess is not supported.

Exemples

Les exemples suivants montrent comment utiliser des fonctions d’agrégation :

Par souci de concision, ces exemples n’indiquent pas la demande et la réponse complètes.

Liste de statuts uniques dans la requête

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

Corps de réponse

{
    "@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
        }
    ]
}

Dénombrement par valeurs de statut

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

Corps de réponse

{
    "@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
        }
    ]
}

Somme agrégée des revenus

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

Corps de réponse

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

Revenu moyen en fonction du statut

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

Corps de réponse

{
    "@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
        }
    ]
}

Somme des revenus en fonction du statut

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

Corps de réponse

{
    "@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
        }
    ]
}

Total des revenus du compte par nom de contact principal

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

Corps de réponse

{
    "@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>
      
    ]
}

Noms du contact principal pour les comptes dans « WA »

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

Corps de réponse

{
    "@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)"
        }
    ]
}

Date et heure de l’enregistrement créé en dernier

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

Corps de réponse

{
    "@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"
        }
    ]
}

Date et heure de l’enregistrement créé en premier

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

Corps de réponse

{
    "@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"
        }
    ]
}

Valeurs de colonne distinctes

OData n’a pas d’option de requête $distinct pour limiter les résultats à des valeurs uniques. À la place, utilisez l’option de requête système $apply avec la transformation groupby. Cette méthode retourne des valeurs distinctes pour chaque propriété.

Demande :

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"

Réponse :

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
      }
   ]
}

Limitations de l’agrégation OData

Cette section décrit les fonctionnalités disponibles à l’aide de l’agrégation avec FetchXml qui ne sont pas actuellement disponibles à l’aide d’OData.

Obtenez un numéro distinct avec CountColumn

Vous ne pouvez pas obtenir un nombre distinct de valeurs à l’aide de CountColumn avec OData. Découvrez les valeurs de colonne distinctes à l’aide de FetchXml.

Fuseau horaire lors du regroupement par date

Le regroupement par parties d’une date utilise toujours l’heure UTC et il n’existe aucun moyen de spécifier que le fuseau horaire de l’utilisateur doit être utilisé à la place. Découvrez le regroupement par parties d’une date dans FetchXml.

Agrégation de lignes

Lorsqu’une table a une relation hiérarchique définie, vous ne pouvez pas renvoyer un agrégat de lignes dans la colonne de recherche pour la relation hiérarchique. Découvrez les agrégats de lignes à l’aide de FetchXml.

Limite par requête

Vous ne pouvez pas spécifier de limite d’agrégation configurable. Découvrez les limites de requête par requête à l’aide de FetchXml.

Limites

Les requêtes qui renvoient des valeurs agrégées sont limitées à 50 000 enregistrements. Cette limite aide à gérer les performances et la fiabilité du système. Si les critères de filtre de votre requête renvoient plus de 50 000 enregistrements, vous obtenez le message d’erreur suivant :

Nombre : -2147164125
Code : 8004E023
Message : AggregateQueryRecordLimit exceeded. Cannot perform this operation.
Message d’erreur client : La limite d’enregistrement maximale est dépassée. Réduisez le nombre d’enregistrements.

Pour éviter cette erreur, ajoutez des filtres appropriés à votre requête pour garantir qu’elle n’évalue pas plus de 50 000 enregistrements. Ensuite, exécutez votre requête plusieurs fois et combinez les résultats. Les filtres appropriés dépendent de la nature de vos données, mais il peut s’agir d’une plage de dates ou d’un sous-ensemble de valeurs dans une colonne de choix.

Étapes suivantes

Découvrez comment compter des lignes.