Re: 13583について

この質問の投稿一覧へ

なし Re: 13583について

msg# 1.1
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 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.