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:
Lassen Sie die ColumnSet.AllColumns-Eigenschaft auf
false
. Legen Sie sie nicht mit dem ColumnSet(Boolean)-Konstruktor fest.Fügen Sie der Sammlung ColumnSet.AttributeExpressions Instanzen der XrmAttributeExpression-Klasse hinzu
Legen Sie für jede Spalte, die Sie zurückgeben möchten, die folgenden Eigenschaften fest:
XrmAttributeExpression-Eigenschaft Beschreibung AttributeName Den LogicalName
der SpalteAlias Der Aliaswert für die Spalte Legen Sie für jede Spalte, die Sie aggregieren möchten, den AggregateType auf die Art der Aggregation fest, die Sie durchführen möchten. Erfahren Sie mehr über Aggregationstypen
Legen Sie für jede Spalte, nach der Sie die Ergebnisse gruppieren möchten, die folgenden Eigenschaften fest:
XrmAttributeExpression-Eigenschaft Beschreibung AggregateType Auf XrmAggregateType .None
festlegenHasGroupBy Festgelegt auf true
.DateTimeGrouping Wenn die Gruppierung Datetime-Werte umfasst, geben Sie den anzuwendenden Typ der Datetime-Gruppierung mithilfe der Elemente der XrmDateTimeGrouping-Enumeration an. Erfahren Sie mehr über das Gruppieren nach Teilen eines Datums
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).