# グルーピングエレメント

Data Shaping Query LanguageのGROUP BY句とGROUP AS句を使い、フラットファイルから階層を作成します。

## 始める前に

* 入力と出力のストラクチャーが作成済みであること。ストラクチャーの作成には下のJSONサンプルを使用できます。

## このタスクについて

この例では、フラットなJSONファイルから店舗に関するデータを抽出して階層ストラクチャーに書き込むDSQLマップを作成します。

以下のサンプルJSONでは、items配列の各オブジェクトに、項目に関するデータ(店舗や部署など)が含まれています。出力では、項目ごとのレコードではなく、まず店舗ごとのレコード、次に各店舗の部署ごとのレコード、最後に各部署でのオブジェクトごとのレコードを持つようにしたいと考えています。

入力データは次のようになります。

```
{
    "items": [
        {
            "store_name": "plusstore",
            "store_location": "saint louis",
            "department_name": "sports",
            "salesperson_id": "25",
            "item_name": "MBIKE"
        },
        {
            "store_name": "plusstore",
            "store_location": "saint louis",
            "department_name": "sports",
            "salesperson_id": "25",
            "item_name": "ESCOOT"
        },
        {
            "store_name": "plusstore",
            "store_location": "saint louis",
            "department_name": "electronics",
            "salesperson_id": "32",
            "item_name": "Portable SSD T5"
        },
        {
            "store_name": "plusstore",
            "store_location": "saint louis",
            "department_name": "electronics",
            "salesperson_id": "32",
            "item_name": "Extreme Portable SSD"
        },
        {
            "store_name": "goodstore",
            "store_location": "nashville",
            "department_name": "electronics",
            "salesperson_id": "47",
            "item_name": "Toshiba P300"
        },
        {
            "store_name": "goodstore",
            "store_location": "nashville",
            "department_name": "fresh",
            "salesperson_id": "47",
            "item_name": "Italian tomatoes"
        }
    ]
}
```

出力ストラクチャーは次のようになります。

```
{
    "stores": [
        {
            "name": "",
            "location": "",
            "departments": [
                {
                    "name": "",
                    "salesperson_id": "",
                    "items": [
                        {
                            "name": ""
                        }
                    ]
                }
            ]
        }
    ]
}
```

## 手順

1. 新しいDSQLマップを作成して入力ストラクチャーと出力ストラクチャーを追加します。

   ルートエレメント間に最初のマッピングが自動的に作成されます。出力ストラクチャーのルートエレメントに、対応するData Shaping Query Languageの式が表示されます。 ![ルートエレメントのマッピング。](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/Resources/images/tdm-dsql-map-editor-group-map.png)
2. stores出力エレメントをクリックして次の式を入力します。
   ```
   FROM items
   GROUP BY store_name
   GROUP AS gstore
   ```

   GROUP BY句は、それぞれ一意であるstore\_name値に対し、出力によってstoresの出現が1回のみ生成されるようにします。GROUP AS句は、現在のグループに名前を割り当てるために使用されます。この名前は後で他の式で使用することもできます。詳細は、[TalendData Shaping Languageリファレンスガイド](https://help.qlik.com/talend/ja-JP/data-shaping-language-reference-guide/8.0)をご覧ください。
3. storesの下にあるname出力エレメントにstore\_nameを配置します。
4. location出力エレメントをクリックして次の式を入力します。
   ```
   gstore[0].store_location
   ```

   同じグループに値が異なるstore\_locationが複数存在する可能性もあるため、この場合はstore\_locationを単純に式として使用することはできません。グループピングはstore\_nameで行われるため、各グループで一意値を持つことが保証されているのはこのエレメントだけです。

   上の式は、出力値が現在のグループの最初の項目にあるstore\_locationエレメントの値となることを示しています。
5. departmentsエレメントをクリックして次の式を入力します。
   ```
   FROM gstore
   GROUP BY department_name
   GROUP AS gdepartment
   ```

   これはstoresエレメントと同じ処理を行いますが、ここでは一意のdepartment\_name値ごとにdepartments配列の出現を1回生成します。
6. departmentsの下にあるname出力エレメントにdepartment\_nameを配置し、salesperson\_id出力エレメントをクリックして次の式を入力します。
   ```
   gdepartment[0].salesperson_id
   ```
7. items出力エレメントをクリックしてFROM gdepartmentと入力し、item\_nameをitemsの下にあるnameエレメントに配置します。

   ![\[items\] (項目)のプロパティ。](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/Resources/images/tdm-dsql-map-editor-group-map-result.png)

## タスクの結果

マップが設定され、[Test Run] (テスト実行)機能を使った結果をチェックできるようになります。この例では、次の結果が返されます。

```
{
   "stores":[
      {
         "name":"plusstore",
         "location":"saint louis",
         "departments":[
            {
               "name":"electronics",
               "salesperson_id":"32",
               "items":[
                  {
                     "name":"Portable SSD T5"
                  },
                  {
                     "name":"Extreme Portable SSD"
                  }
               ]
            },
            {
               "name":"sports",
               "salesperson_id":"25",
               "items":[
                  {
                     "name":"MBIKE"
                  },
                  {
                     "name":"ESCOOT"
                  }
               ]
            }
         ]
      },
      {
         "name":"goodstore",
         "location":"nashville",
         "departments":[
            {
               "name":"electronics",
               "salesperson_id":"47",
               "items":[
                  {
                     "name":"Toshiba P300"
                  }
               ]
            },
            {
               "name":"fresh",
               "salesperson_id":"47",
               "items":[
                  {
                     "name":"Italian tomatoes"
                  }
               ]
            }
         ]
      }
   ]
}
```