13583について

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2021-11-6 17:20
ruttey  新米   投稿数: 3
この問題の解説にある、下記ですが、

↓解説
設問のSQL文では、最初に内側の副問合せである
 SELECT MAX(SUM(salary))
 FROM employees
 GROUP BY department_id
が実施されます。この問合せでは、DEPARTMENT_ID毎の給与の合計額を計算し、一番多い給与の合計額を1件返します。
↑解説
このSQLで1件のみ返すというのが良く理解できないのですが、
グループ関数が入れ子になっている場合、group byは内側の
SQLのみに掛かるという意味でしょうか?MAXがなければdepartmentid毎に複数の結果が返りますよね?
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2021-11-6 23:39
arashi1977  長老 居住地: 広島  投稿数: 1715
ちょっと疑問点がはっきり読み取れてないのですが
引用:
このSQLで1件のみ返すというのが良く理解できないのですが、
グループ関数が入れ子になっている場合、group byは内側の
SQLのみに掛かるという意味でしょうか?MAXがなければdepartmentid毎に複数の結果が返りますよね?
提示されたのは
 SELECT MAX(SUM(salary))
 FROM employees
 GROUP BY department_id
だけですが、設問のSQL全体で見ると
 SELECT employee_id, employee_name 
 FROM employees
 WHERE department_id IN 
  (SELECT department_id
   FROM employees 
   HAVING SUM(salary) = 
    (SELECT MAX(SUM(salary)) 
     FROM employees 
     GROUP BY department_id) 
   GROUP BY department_id);
ですよね。分解したら内側から
A.
    (SELECT MAX(SUM(salary)) 
     FROM employees 
     GROUP BY department_id) 
B.
  (SELECT department_id
   FROM employees 
   HAVING SUM(salary) = A
   GROUP BY department_id)

C.
 SELECT employee_id, employee_name 
 FROM employees
 WHERE department_id IN B;
になります。こうしてみると、GROUP BYはそれぞれの副問合せの中にあるので、「内側(副問合せのこと?)のSQLのみに掛かる」という理解はあっています。

で、これとは別に
引用:
MAXがなければdepartmentid毎に複数の結果が返りますよね?
という話もありますが、これは上記AのSQLについての話題で良いですよね?
その場合、実際に実行してみるとこんな感じです。
SQL> select department_id,sum(salary) from employees group by department_id;

DEPARTMENT_ID SUM(SALARY)
------------- -----------
            1     3450000
            2     1200000
            4     1100000
            5      900000
            3     1200000

SQL> select max(sum(salary)) from employees group by department_id;

MAX(SUM(SALARY))
----------------
         3450000
出力からイメージできるかと思いますが、「department_idごと(group by)にsalaryをsumし、そのsumした結果の中で最大(max)を取得する」なので、1件だけ返ってくる、ということです。
※というか「最大」が複数あるわけない、って単純な話でもあるんですけどね

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.