group-by rollup
rollup は、グループ化されたデータの集計を作成して表示する group-by の従属句です。Rollup の出力は、クエリの列の順序に基づきます。
構文
group-by rollup の構文を次に示します。
1group data_stream by rollup(fields);- data_stream
- グループへのデータ入力。
- fields
- データのグループ化の基準となる項目。
rollup では、次の集計関数がサポートされています。
- average()
- count()
- min()
- max()
- sum()
- unique()
次の例では、最初に Category と Sub-Category で結果をグループ化し、それぞれの結果の行で集計関数 sum('Sales') を実行します。group-by 句を rollup で修飾すると、クエリは結果を「積み上げ集計」し、小計と総計を生成します。
1q = load "Superstore";
2q = group q by rollup('Category', 'Sub_Category');
3q = order q by ('Category');
4q = foreach q generate 'Category' as 'Category', 'Sub_Category' as 'Sub_Category', sum('Sales') as 'sum_sales';| カテゴリ | サブカテゴリ | sum_sales |
|---|---|---|
| Furniture | Bookcases | 114,348 |
| Chairs | 328,237 | |
| Furnishings | 91,514 | |
| Tables | 206,966 | |
| - | 741,064 | |
| Office Supplies | Appliances | 107,532 |
| Art | 27,119 | |
| Binders | 203,413 | |
| Envelopes | 16,363 | |
| Fasteners | 3,024 | |
| Labels | 12,486 | |
| Paper | 78,479 | |
| Storage | 223,844 | |
| Supplies | 46,674 | |
| - | 718,934 | |
| Technology | Accessories | 167,380 |
| Copiers | 149,528 | |
| Machines | 189,239 | |
| Phones | 329,636 | |
| - | 835,783 | |
| - | 2,295,781 |
このクエリは最初に、指定されたカテゴリのサブカテゴリごとに総売り上げをグループ化します。次に、単一のカテゴリの総売り上げをグループ化します。各カテゴリの総売り上げが判明すると、クエリはすべてのカテゴリの総売り上げを生成します。
null 値を含む rollup
次の例は、null 値がクエリ結果にどのように表示されるかを示しています。このクエリは、最初の例のクエリと同じです。
1q = load "Superstore";
2q = group q by rollup('Category', 'Sub_Category');
3q = foreach q generate 'Category' as 'Category', 'Sub_Category' as 'Sub_Category', sum('Sales') as 'sum_sales';
4q = order q by ('Category', 'Sub_Category');| カテゴリ | サブカテゴリ | sum_sales |
|---|---|---|
| Furniture | Bookcases | 114,348 |
| Chairs | 328,237 | |
| Furnishings | 91,514 | |
| Tables | 206,966 | |
| - | 92 | |
| - | 741,156 | |
| Office Supplies | Appliances | 107,532 |
| Art | 27,119 | |
| Binders | 203,413 | |
| Envelopes | 16,363 | |
| Fasteners | 3,024 | |
| Labels | 12,486 | |
| Paper | 78,479 | |
| Storage | 223,844 | |
| Supplies | 46,674 | |
| - | 273 | |
| - | 719,206 | |
| Technology | Accessories | 167,380 |
| Copiers | 149,528 | |
| Machines | 189,239 | |
| Phones | 329,636 | |
| - | 259 | |
| - | 836,041 | |
| - | Computers | 113 |
| Projectors | 744 | |
| - | 562 | |
| 1,420 | ||
| 2,297,824 |
このクエリは最初に、指定されたカテゴリのサブカテゴリごとに総売り上げをグループ化します。この例では、各カテゴリに null サブカテゴリが含まれています。各サブカテゴリの総売り上げには、null サブカテゴリの値も含まれています。
クエリによってすべての名前付きカテゴリ (値を持つカテゴリ) が判明すると、null カテゴリのサブカテゴリと総売り上げが表示されます。最後に、クエリはすべてのカテゴリの総売り上げを生成します。
null 値を含む rollup と case ステートメント
grouping 関数と case ステートメントを併用して、小計および総計カテゴリにラベルを付けることができます。次の例の場合、最初の case では、Category 項目の rollup で null 値が生成されていないかを検査します。null 値が生成されている場合、クエリは項目 All Categories にラベルを付けます。2 番目の case では、Sub-Category 項目が同様に null であるかどうかを検査します。null の場合、クエリは項目 All Sub-Categories にラベルを付けます。
1q = load "Superstore";
2q = group q by rollup ('Category', 'Sub_Category');
3q = foreach q generate
4(case
5 when grouping('Category') == 1 then "All Categories"
6 else 'Category'
7end) as 'Category',
8(case
9 when grouping('Sub_Category') == 1 then "All Sub-Categories"
10 else 'Sub_Category'
11end) as 'SubCategory', sum('Sales') as 'sum_sales';| カテゴリ | サブカテゴリ | sum_sales |
|---|---|---|
| Furniture | Bookcases | 114,348 |
| Chairs | 328,237 | |
| Furnishings | 91,514 | |
| Tables | 206,966 | |
| - | 92 | |
| すべてのサブカテゴリ | 741,156 | |
| Office Supplies | Appliances | 107,532 |
| Art | 27,119 | |
| Binders | 203,413 | |
| Envelopes | 16,363 | |
| Fasteners | 3,024 | |
| Labels | 12,486 | |
| Paper | 78,479 | |
| Storage | 223,844 | |
| Supplies | 46,674 | |
| - | 273 | |
| すべてのサブカテゴリ | 719,206 | |
| Technology | Accessories | 167,380 |
| Copiers | 149,528 | |
| Machines | 189,239 | |
| Phones | 329,636 | |
| - | 259 | |
| すべてのサブカテゴリ | 836,041 | |
| - | Computers | 113 |
| Projectors | 744 | |
| - | 562 | |
| すべてのサブカテゴリ | 1,420 | |
| すべてのカテゴリ | すべてのサブカテゴリ | 2,297,824 |