メインコンテンツにスキップ
モジュール 3 · レッスン 3 / 4コース内の 11/57~10 min
モジュールのレッスン (3/4)

GROUP BYによるグループ化

モジュール 2 では、COUNT(*)、AVG(...)、SUM(...) によってすべてのコストが削減されることを学習しました。 行を 単一 の結果行に追加します。しかし、平均給与が必要な場合はどうなるでしょうか? 会社全体ではなく、部門ごとに? ごとに 1 行が必要です グループ。それが GROUP BY の仕事です。

構文

SQL
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM   table
GROUP BY grouping_column;

英語で読む: _"同じ値を共有するグループに行を分割します。 grouping_column を実行し、グループごとに集計を計算します。

SQL
-- Average salary per department:
SELECT department_id, AVG(salary) AS average
FROM   employees
GROUP BY department_id;

結果には、各 department_id ごとに 1 行が含まれます。 employees。 4 つの部門 (1、2、 3、4) に加えて、NULL (アンドレア コスタ) に 1 つ。

読み取り可能な名前の JOIN を使用する

department_id でグループ化したいが、その 名前 を表示したい場合がよくあります。 部門。 GROUP BY と JOIN を組み合わせます。

SQL
SELECT d.name AS department,
       COUNT(*)    AS count,
       AVG(e.salary) AS average_salary
FROM   employees   AS e
JOIN   departments AS d ON e.department_id = d.id
GROUP BY d.name
ORDER BY count DESC;

これは本格的な ビジネス インテリジェンス クエリです。3 行で次のようになります。 各部門の従業員数とその収入が表示されます。 平均。最大から最小の順に並べ替えられます。

黄金律

GROUP BY を使用する場合、SELECT のすべての列は次のようにする必要があります:

  1. グループ化列の 1 つ (例: department_id、d.name)、または
  2. 集計関数内 (例: AVG(salary)、COUNT(*))。
SQL
-- ERROR: first_name is neither in GROUP BY nor inside an aggregate
SELECT department_id, first_name, AVG(salary)
FROM   employees
GROUP BY department_id;

PostgreSQL は明示的なエラーを返します (" 列は GROUP BY に存在する必要があります) 句で使用することも、集計関数で使用することもできます")。週初めはよくあることだ 間違い: それを見つけたら、立ち止まって自問してください 「その価値は何ですか?」 first_name は 3 人のグループですか?」 — 単一の答えはありません。 それがエンジンが拒否する理由です。

試してみてください

運動#sql.m3.l3.e1
試行回数: 0読み込み中…

部門ごとに、その部門に含まれる従業員の数を計算します。部門名 (Departments.name) と従業員数の 2 つの列を返します。部門ごとに 1 行。

エディターを読み込み中…
ヒントを表示

COUNT(*) で集計し、d.name でグループ化します。 SELECT にはグループ化列と集計のみを含める必要があります。

3 回の試行後に解決策が利用可能になります

復習演習

運動#sql.m3.l3.e2
試行回数: 0読み込み中…

各部門 (Departments.name) について、その従業員の平均給与 (AVG(salary)) を最高から最低の順に計算します。

エディターを読み込み中…
ヒントを表示

AVG(e.salary) を集計として、GROUP BY d.name、ORDER BY Average DESC。

3 回の試行後に解決策が利用可能になります