Freigeben über


Daten mithilfe von QueryExpression aggregieren

QueryExpression umfasst Features zum Gruppieren und Aggregieren, mit denen Sie Summe, Durchschnitt, Minimum, Maximum und die Anzahl über mehrere Reihen von Daten hinweg berechnen können.

Um einen Aggregatwert zurückzugeben, müssen Sie:

Arten von Aggregationen

Die möglichen Aggregationstypen sind Elemente der XrmAggregateType-Enumeration.

XrmAggregateType-Elemente Beschreibung
Avg Der Durchschnittswert der Spaltenwerte mit Daten.
Count Die Anzahl der Zeilen.
CountColumn Die Anzahl der Zeilen mit Daten in dieser Spalte.
Max Der Maximalwert der Zeilen in dieser Spalte.
Min Der Minimalwert der Zeilen in dieser Spalte.
None Verwenden Sie dies, wenn die Spalte zum Gruppieren der aggregierten Daten verwendet wird. Der HasGroupBy-Wert muss auf true festgelegt werden.
Sum Der Gesamtwert der Spaltenwerte mit Daten.

Beachten Sie die folgenden Punkte:

  • Nullwerte werden bei der Berechnung von Aggregatwerten nicht berücksichtigt.
  • Sie können Daten aus Tabellen verwenden, die mithilfe der LinkEntity-Klasse verknüpft sind.
  • Sie können Filter anwenden, um die Ergebnisse wie bei jeder Abfrage einzuschränken.

Beispiel

Nehmen wir an, Sie haben 10 Kontodatensätze mit den folgenden Daten:

Anzahl der Mitarbeiter Name des Dataflows Adresse 1: Ort Erstellt am
NULL Zum Beispiel: „Konto”. NULL 25.08.2023
1.500 Contoso Pharmaceuticals (Beispiel) Stuttgart 25.03.2023
2.700 Fabrikam Inc. (Beispiel) Lynnwood 25.03.2023
2.900 Blue Yonder Airlines (Beispiel) Los Angeles 25.03.2023
2.900 City Power & Light (Beispiel) Stuttgart 25.03.2023
3.900 Coho Winery (Beispiel) Phoenix 25.03.2023
4.300 Adventure Works (Beispiel) Santa Cruz 25.03.2023
4.800 Alpine Ski House (Beispiel) Missoula 25.03.2023
6.000 Litware, Inc. (Beispiel) Dallas 25.03.2023
6.200 A. Datum Corporation (Beispiel) Stuttgart 25.03.2023

Die folgende Abfrage gibt aggregierte Daten für die Spalte numberofemployees zurück.

QueryExpression query = new()
{
    EntityName = "account",
    ColumnSet = new ColumnSet(false)
    {
        AttributeExpressions = {
            {
                new XrmAttributeExpression(
                    attributeName: "numberofemployees",
                    alias: "Average",
                    aggregateType: XrmAggregateType.Avg)
            },
            {
                new XrmAttributeExpression(
                    attributeName: "numberofemployees",
                    alias: "Count",
                    aggregateType: XrmAggregateType.Count)
            },
            {
                new XrmAttributeExpression(
                    attributeName: "numberofemployees",
                    alias: "ColumnCount",
                    aggregateType: XrmAggregateType.CountColumn)
            },
            {
                new XrmAttributeExpression(
                    attributeName: "numberofemployees",
                    alias: "Maximum",
                    aggregateType: XrmAggregateType.Max)
            },
            {
                new XrmAttributeExpression(
                    attributeName: "numberofemployees",
                    alias: "Minimum",
                    aggregateType: XrmAggregateType.Min)
            },
            {
                new XrmAttributeExpression(
                    attributeName: "numberofemployees",
                    alias: "Sum",
                    aggregateType: XrmAggregateType.Sum)
            }
        }
    }
};

Die Ergebnisse sind eine einzelne Zeile:

 --------------------------------------------------------------
 | Average | Count | ColumnCount | Maximum | Minimum | Sum    |
 --------------------------------------------------------------
 | 3,911   | 10    | 9           | 6,200   | 1,500   | 35,200 |
 --------------------------------------------------------------

Gruppierung

Gruppieren Sie die Ergebnisse einer Aggregatabfrage, indem Sie eine XrmAttributeExpression hinzufügen, bei der die HasGroupBy-Eigenschaft AggregateType auf XrmAggregateType.None festgelegt ist.

Beim Gruppieren sollten Sie eine QueryExpression.Orders mit einer OrderExpression angeben, bei der die Alias-Eigenschaft auf den Alias der Gruppe festgelegt ist.

Die folgende Abfrage gibt beispielsweise die Summe der Mitarbeitenden und die Anzahl nach Stadt zurück:

QueryExpression query = new()
{
      EntityName = "account",
      ColumnSet = new ColumnSet(false)
   {
         AttributeExpressions = {
            {
                  new XrmAttributeExpression(
                     attributeName: "numberofemployees",
                     alias: "Total",
                     aggregateType: XrmAggregateType.Sum)
            },
            {
                  new XrmAttributeExpression(
                     attributeName: "address1_city",
                     alias: "Count",
                     aggregateType: XrmAggregateType.Count)
            },
            {
                  new XrmAttributeExpression(
                     attributeName: "address1_city",
                     alias: "City",
                     aggregateType: XrmAggregateType.None){
                     HasGroupBy = true
            }
         }
      }
   }
};
query.Orders.Add(new OrderExpression(
            attributeName: "address1_city",
            alias: "City",
            orderType: OrderType.Ascending));

Die Abfrage gruppiert die Ergebnisse nach dem Wert City und kombiniert die Ergebnisse für die drei Zeilen, in denen die Stadt „Redmond“ lautet.

Gesamt Anzahl Stadt
0 1 NULL
6.000 1 Dallas
2.900 1 Los Angeles
2.700 1 Lynnwood
4.800 1 Missoula
3.900 1 Phoenix
10.600 3 Stuttgart
4.300 1 Santa Cruz

Gruppieren nach Teilen eines Datums

Sie können auswählen, welcher Teil des Datums beim Gruppieren nach Datum verwendet werden soll. Legen Sie XrmAttributeExpression.DateTimeGrouping auf eines der Elemente der XrmDateTimeGrouping-Enumeration fest.

XrmDateTimeGrouping-Element Beschreibung
None Keine Datetime-Gruppierung
Day Nach Tag gruppieren
Week Nach Woche gruppieren
Month Nach Monat gruppieren
Quarter Nach Quartal gruppieren
Year Nach Jahr gruppieren
FiscalPeriod Nach Finanzzeitraum gruppieren
FiscalYear Nach Geschäftsjahr gruppieren

Die folgende Abfrage gruppiert Kontodatensätze, die die Anzahl der Mitarbeitenden zeigen, nach dem Zeitpunkt, an dem die Datensätze erstellt wurden:

QueryExpression query = new()
{
    EntityName = "account",
    ColumnSet = new ColumnSet(false)
    {
        AttributeExpressions = {
            {
                new XrmAttributeExpression(
                    attributeName: "numberofemployees",
                    alias: "Total",
                    aggregateType: XrmAggregateType.Sum)
            },
            {
                new XrmAttributeExpression(
                    attributeName: "createdon",
                    alias: "Day",
                    aggregateType: XrmAggregateType.None){
                    HasGroupBy = true,
                    DateTimeGrouping = XrmDateTimeGrouping.Day
                }
            },
            {
                new XrmAttributeExpression(
                    attributeName: "createdon",
                    alias: "Week",
                    aggregateType: XrmAggregateType.None){
                    HasGroupBy = true,
                    DateTimeGrouping = XrmDateTimeGrouping.Week
                }
            },
                                    {
                new XrmAttributeExpression(
                    attributeName: "createdon",
                    alias: "Month",
                    aggregateType: XrmAggregateType.None){
                    HasGroupBy = true,
                    DateTimeGrouping = XrmDateTimeGrouping.Month
                }
            },
            {
                new XrmAttributeExpression(
                    attributeName: "createdon",
                    alias: "Year",
                    aggregateType: XrmAggregateType.None){
                    HasGroupBy = true,
                    DateTimeGrouping = XrmDateTimeGrouping.Year
                }
            },
            {
                new XrmAttributeExpression(
                    attributeName: "createdon",
                    alias: "FiscalPeriod",
                    aggregateType: XrmAggregateType.None){
                    HasGroupBy = true,
                    DateTimeGrouping = XrmDateTimeGrouping.FiscalPeriod
                }
            },
            {
                new XrmAttributeExpression(
                    attributeName: "createdon",
                    alias: "FiscalYear",
                    aggregateType: XrmAggregateType.None){
                    HasGroupBy = true,
                    DateTimeGrouping = XrmDateTimeGrouping.FiscalYear
                }
            }
        }
    }
};
query.Orders.Add(new OrderExpression(
            attributeName: "createdon",
            alias: "Month",
            orderType: OrderType.Ascending));

Die folgende Tabelle zeigt das Ergebnis anhand des zuvor erwähnten Beispiel-Dataset:

 -----------------------------------------------------------------------
 | Total  | Day | Week | Month | Year  | FiscalPeriod     | FiscalYear |
 -----------------------------------------------------------------------
 | 35,200 | 25  | 12   | 3     | 2,023 | Quarter 1 FY2023 | FY2023     |
 -----------------------------------------------------------------------
 | 0      | 27  | 35   | 8     | 2,023 | Quarter 3 FY2023 | FY2023     |
 -----------------------------------------------------------------------

Beispiel für eine Buchhaltungsperioden-Datumsgruppierung

Das folgende Beispiel zeigt eine QueryExpression, welche die Gesamtzahl von erfüllten Aufträgen summiert und das Ergebnis nach Geschäftshalbjahr und Geschäftsjahr gruppiert.

QueryExpression query = new()
{
    EntityName = "salesorder",
    ColumnSet = new ColumnSet(false)
    {
        AttributeExpressions = {
            {
                new XrmAttributeExpression(
                    attributeName: "totalamount",
                    alias: "total",
                    aggregateType: XrmAggregateType.Sum)
            },
            {
                new XrmAttributeExpression(
                    attributeName: "datefulfilled",
                    alias: "date",
                    aggregateType: XrmAggregateType.None){
                    HasGroupBy = true,
                    DateTimeGrouping = XrmDateTimeGrouping.FiscalPeriod
                }
            }
        }
    }
};
query.Orders.Add(new OrderExpression(
            attributeName: "datefulfilled",
            alias: "Date",
            orderType: OrderType.Ascending));

Einschränkungen bei der QueryExpression-Aggregation

In diesem Abschnitt werden Funktionen beschrieben, die bei der Aggregation mit FetchXml verfügbar sind, derzeit jedoch bei Verwendung von QueryExpression nicht zur Verfügung stehen.

Eindeutige Zahlen mit CountColumn erhalten

Sie können mit CountColumn und QueryExpression keine eindeutige Anzahl von Werten abrufen. Erfahren Sie mehr über eindeutige Spaltenwerte bei Verwendung von FetchXml

Zeitzone beim Gruppieren nach Datum

Beim Gruppieren nach Teilen eines Datums wird immer die UTC-Zeit verwendet. Es kann nicht angegeben werden, dass stattdessen die Zeitzone des Benutzenden verwendet werden soll, was in FetchXml möglich ist

Zeilenaggregat

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 bei Verwendung von FetchXml

Limit pro Abfrage

Es gibt keine Möglichkeit, eine konfigurierbare Aggregationsgrenze festzulegen Erfahren Sie mehr über Grenzen pro Abfrage bei Verwendung 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.

Hinweis

Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)

Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).