モジュールのレッスン (3/4)
GROUP BYによるグループ化
モジュール 2 では、COUNT(*)、AVG(...)、SUM(...) によってすべてのコストが削減されることを学習しました。
行を 単一 の結果行に追加します。しかし、平均給与が必要な場合はどうなるでしょうか?
会社全体ではなく、部門ごとに? ごとに 1 行が必要です
グループ。それが GROUP BY の仕事です。
構文
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM table
GROUP BY grouping_column;英語で読む: _"同じ値を共有するグループに行を分割します。
grouping_column を実行し、グループごとに集計を計算します。
-- 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 を組み合わせます。
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 つ (例:
department_id、d.name)、または - 集計関数内 (例:
AVG(salary)、COUNT(*))。
-- 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 人のグループですか?」 — 単一の答えはありません。
それがエンジンが拒否する理由です。
試してみてください
部門ごとに、その部門に含まれる従業員の数を計算します。部門名 (Departments.name) と従業員数の 2 つの列を返します。部門ごとに 1 行。
ヒントを表示
COUNT(*) で集計し、d.name でグループ化します。 SELECT にはグループ化列と集計のみを含める必要があります。
3 回の試行後に解決策が利用可能になります
復習演習
各部門 (Departments.name) について、その従業員の平均給与 (AVG(salary)) を最高から最低の順に計算します。
ヒントを表示
AVG(e.salary) を集計として、GROUP BY d.name、ORDER BY Average DESC。
3 回の試行後に解決策が利用可能になります