QueryExpression を使用してデータを集計する

QueryExpression には、合計、平均、最小値、最大値、および複数のデータの行数を計算できるグループ化と集計の機能が含まれています。

集計値を返すには、次のことを行う必要があります:

集計の種類

実行できる集計のタイプは、XrmAggregateType 列挙型メンバーです。

XrmAggregateType メンバー 説明
Avg データを持つ列値の平均値です。
Count 返される行の数です。
CountColumn その列にデータがある行の数です。
Max その列に含まれる行の最大値です。
Min その列に含まれる行の最小値です。
None 集計データをグループ化するために列を使用する場合にこれを使用します。 HasGroupBy 値を true に設定する必要があります。
Sum データを持つ列値の合計値です。

次のポイントに注意します。

  • 集計値を計算する場合、Null 値は考慮されません。
  • LinkEntity クラスを使用して、結合されたテーブルからのデータを使用できます。
  • 他のクエリと同様に、フィルターを適用 して結果を制限できます。

次のデータを含む 10 個のアカウント レコードがあるとします。

従業員数 件名 住所 1 市区町村 作成日
NULL たとえば、「取引先企業」です NULL 2023/8/25
1,500 Contoso Pharmaceuticals (サンプル) レドモンド 2023/3/25
2,700 Fabrikam, Inc. (サンプル) リンウッド 2023/3/25
2,900 Blue Yonder Airlines (サンプル) ロサンゼルス 2023/3/25
2,900 City Power & Light (サンプル) レドモンド 2023/3/25
3,900 Coho Winery (サンプル) フェニックス 2023/3/25
4,300 Adventure Works (サンプル) サンタクルーズ 2023/3/25
4,800 Alpine Ski House (サンプル) ミズ―ラ 2023/3/25
6,000 Litware, Inc. (サンプル) ダラス 2023/3/25
6,200 A. Datum Corporation (サンプル) レドモンド 2023/3/25

次のクエリは、numberofemployees 列の集計データを返します。

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)
            }
        }
    }
};

結果は 1 行です:

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

グループ

集計クエリの結果をグループ化するには、HasGroupBy プロパティ AggregateTypeXrmAttributeExpression を追加し、XrmAggregateType.None に設定します。

グループ化する場合、グループのエイリアスに設定された エイリアス プロパティ を持つ OrderExpression を使用して QueryExpression.Orders を指定する必要があります。

たとえば、次のクエリは従業員の合計と都市ごとの数を返します:

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));

クエリは結果を City 値別にグループ化し、都市が "レドモンド" である 3 つの行の結果を結合します。

トータル 都市
0 1 NULL
6,000 1 ダラス
2,900 1 Los Angeles
2,700 1 リンウッド
4,800 1 ミズ―ラ
3,900 1 フェニックス
10,600 3 レドモンド
4,300 1 サンタクルーズ

日付の部分ごとにグループ化する

日付でグループ化するときに、日付のどの部分を使用するかを選択できます。 XrmAttributeExpression.DateTimeGroupingXrmDateTimeGrouping enum メンバーの 1 つに設定します。

XrmDateTimeGrouping メンバー 説明
None DateTime グループ化なし
Day 日別のグループ化
Week 週別のグループ化
Month 月別のグループ化
Quarter 四半期別のグループ化
Year 年別のグループ化
FiscalPeriod FiscalPeriod のグループ化
FiscalYear FiscalYear のグループ化

次のクエリは、レコードが作成された時点による従業員数を示すアカウント レコードをグループ化します:

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));

次の表は、前述の サンプル データセットを使用した結果を示しています。

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

会計期間の日付グループ化の例

以下は、処理済みの注文の総計を計算して結果を上半期/下半期ごとと会計年度ごとにまとめる QueryExpression です。

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));

QueryExpression 集計の制限

このセクションでは、QueryExpression では現在利用できないが、FetchXml による集計で利用できる機能について説明します。

CountColumn で一意の数値を取得する

QueryExpression で CountColumn を使用して、一意の値を取得することはできません。 FetchXml を使用した個別の列値について

日付でグループ化する場合のタイム ゾーン

日付の部分別のグループ化では常に UTC 時間が使用され、代わりにユーザーのタイム ゾーンを使用するように指定する方法はありません FetchXml で利用可能

行の集計

表に 階層関係が定義されている場合、階層関係の参照列で行集計を返すことはできません。 FetchXml を使用した行集計について

クエリごとの制限

構成可能な集計制限を指定する方法はありません。 FetchXml を使用したクエリごとの制限について

制限

返される集計値が 50,000 レコードに限定されたクエリ。 この最大値で、システムの動作および信頼性を保持することができます。 クエリ内のフィルター条件に 50,000 を超えるレコードが含まれる場合は次のエラーが表示されます:

番号: -2147164125
コード: 8004E023
メッセージ: AggregateQueryRecordLimit exceeded. Cannot perform this operation.
クライアント エラー メッセージ: 最大レコード制限を超えています。 レコード数を減らしてください。

このエラーを回避するには、適切なフィルターをクエリに追加して、50,000 超のレコードを評価する必要がないことを確認します。 その後、クエリを何度か実行して結果をまとめます。 適切なフィルターはデータの性質によって異なりますが、日付範囲または選択列の値のサブセットである可能性があります。

次の手順

行の棚卸方法について説明します。

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。