サーチ…


前書き

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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow