サーチ…
前書き
SELECTクエリの結果は、 GROUP BY
文を使用して1つ以上の列でグループ化することができます。グループ化された列内の同じ値を持つすべての結果がまとめて集計されます。 1つの結果ではなく、部分的な結果の表が生成されます。 GROUP BYは、グループ化されていない列を集約する方法を定義するHAVING
ステートメントを使用して、集約関数と組み合わせて使用できます。
構文
GROUP BY {
列式
| ROLLUP(<group_by_expression> [、... n])
| CUBE(<group_by_expression> [、... n])
| GROUPING SETS([、... n])
| () - 総計を計算する
} [、... n]<group_by_expression> :: =
列式
| (列式[、... n])<grouping_set> :: =
() - 総計を計算する
| <grouping_set_item>
| (<grouping_set_item> [、... n])<grouping_set_item> :: =
<group_by_expression>
| ROLLUP(<group_by_expression> [、... n])
| CUBE(<group_by_expression> [、... n])
指定された列内の一意の各エントリの行数をCOUNTまで使用する
列内の特定の値に対してカウントまたは小計を生成するとします。
この表を見ると、 "Westerosians":
名 | GreatHouseAllegience |
---|---|
アリア | スターク |
Cercei | Lannister |
Myrcella | Lannister |
ヤラ | グレイジョイ |
Catelyn | スターク |
サンサ | スターク |
GROUP BYを指定しないと、COUNTは単純に総行数を返します。
SELECT Count(*) Number_of_Westerosians
FROM Westerosians
戻る...
ウェステロス人数 |
---|
6 |
しかし、GROUP BYを追加することで、指定された大家の人数を返すために、与えられた列の各値に対してユーザーをCOUNTすることができます。
SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience
戻る...
家 | ウェステロス人数 |
---|---|
スターク | 3 |
グレイジョイ | 1 |
Lannister | 2 |
GROUP BYとORDER BYを組み合わせて、結果を最大または最小のカテゴリでソートするのは一般的です。
SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience
ORDER BY Number_of_Westerosians Desc
戻る...
家 | ウェステロス人数 |
---|---|
スターク | 3 |
Lannister | 2 |
グレイジョイ | 1 |
HAVING句を使用してGROUP BY結果をフィルタリングする
HAVING句は、GROUP BY式の結果をフィルタリングします。注:次の例では、 ライブラリのサンプルデータベースを使用しています。
例:
複数の本( 実例 )を書いたすべての著者を返します。
SELECT
a.Id,
a.Name,
COUNT(*) BooksWritten
FROM BooksAuthors ba
INNER JOIN Authors a ON a.id = ba.authorid
GROUP BY
a.Id,
a.Name
HAVING COUNT(*) > 1 -- equals to HAVING BooksWritten > 1
;
3人以上の著者がいるすべての本を返します(実際の例 )。
SELECT
b.Id,
b.Title,
COUNT(*) NumberOfAuthors
FROM BooksAuthors ba
INNER JOIN Books b ON b.id = ba.bookid
GROUP BY
b.Id,
b.Title
HAVING COUNT(*) > 3 -- equals to HAVING NumberOfAuthors > 3
;
基本的なGROUP BYの例
説明のためにGROUP BYを「それぞれのために」考えるのは簡単かもしれません。以下のクエリ:
SELECT EmpID, SUM (MonthlySalary)
FROM Employee
GROUP BY EmpID
言っている:
" 各 EmpIDのMonthlySalaryの合計を教えてください"
だからあなたのテーブルがこのように見えたら:
+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1 |200 |
+-----+-------------+
|2 |300 |
+-----+-------------+
結果:
+-+---+
|1|200|
+-+---+
|2|300|
+-+---+
1つの数字の合計がその数字なので、Sumは何もしないように見えます。一方、次のように見える場合は:
+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1 |200 |
+-----+-------------+
|1 |300 |
+-----+-------------+
|2 |300 |
+-----+-------------+
結果:
+-+---+
|1|500|
+-+---+
|2|300|
+-+---+
それは、EmpID 1が2つ一緒に集まっているからです。
ROLAP集約(データマイニング)
説明
SQL標準には、2つの追加集計演算子が用意されています。これらは、属性が取ることができるすべての値のセットを示すために多形性値 "ALL"を使用します。 2つの演算子は次のとおりです。
-
with data cube
では、節の引数属性よりも可能なすべての組み合わせを提供します。 -
with roll up
ことで、属性を左から右へ順に考慮して得られた集合体を、それらが節の引数にどのようにリストされているかを比較する。
これらの機能をサポートするSQL標準バージョン:1999,2003,2006,2008,2011。
例
次の表を参照してください。
フード | ブランド | 合計金額 |
---|---|---|
パスタ | ブランド1 | 100 |
パスタ | Brand2 | 250 |
ピザ | Brand2 | 300 |
立方体で
select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with cube
フード | ブランド | 合計金額 |
---|---|---|
パスタ | ブランド1 | 100 |
パスタ | Brand2 | 250 |
パスタ | すべて | 350 |
ピザ | Brand2 | 300 |
ピザ | すべて | 300 |
すべて | ブランド1 | 100 |
すべて | Brand2 | 550 |
すべて | すべて | 650 |
ロールアップで
select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with roll up
フード | ブランド | 合計金額 |
---|---|---|
パスタ | ブランド1 | 100 |
パスタ | Brand2 | 250 |
ピザ | Brand2 | 300 |
パスタ | すべて | 350 |
ピザ | すべて | 300 |
すべて | すべて | 650 |