質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.61%

SQL グループ化されていない列の表示

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,766

qwerty123

score 28

SQLに関する質問です。初歩的なことだと思うのですが、ご教授お願いします。

下のテーブルから、MGR(マネージャーの番号)、人数、最高給料、最低給料、
マネージャーの名前を抽出したいです。
MGR(マネージャーの番号)、人数、最高給料、最低給料に関しては

SELECT MGR AS マネージャー, COUNT(MGR) AS 人数, MAX(SAL) AS 最高給料,
MIN(SAL) AS 最低給料
FROM EMP
WHERE MGR IS NOT NULL
GROUP BY MGR
ORDER BY MGR ASC

で出すことはできましたが、マネージャーの名前の表示の仕方がわかりません。
上記のSELECT部分に「ENAME」を加えると”GROUP BYの式ではありません”
と表示されてしまいます。マネージャーの番号に対応した、ENAMEの表示をしたいです。



[テーブルEMP]

EMPNO    ENAME    JOB            MGR        HIREDATE            SAL        COMM    DEPTNO
7379    SMITH    CLERK        7902    1980-12-17 00:00:00    400        <NULL>    10
7499    ALLEN    SALESMAN    7698    1981-02-20 00:00:00    400        300        30
7521    WARD    SALESMAN    7698    1981-02-22 00:00:00    1250    500        30
7566    JONES    MANAGER        7839    1981-04-02 00:00:00    2975    <NULL>    20
7654    MARTIN    SALESMAN    7698    1981-09-28 00:00:00    1250    1400    30
7698    BLAKE    MANAGER        7839    1981-05-01 00:00:00    2580    <NULL>    30
7782    CLARK    MANAGER        7839    1981-06-09 00:00:00    2450    <NULL>    10
7788    SCOTT    ANALYST        7566    1987-04-19 00:00:00    3000    <NULL>    20
7839    KING    PRESIDENT    <NULL>    1981-11-17 00:00:00    5000    <NULL>  <NULL>
7844    TURNER    SALESMAN    7698    1981-09-08 00:00:00 1500    0        30
7876    ADAMS    CLERK        7788    1987-05-23 00:00:00    1100    <NULL>    20
7900    JAMES    CLERK        7698    1981-12-03 00:00:00    950        <NULL>    30
7902    FORD    ANALYST        7566    1981-12-03 00:00:00    3000    <NULL>    20
7934    MILLER    CLERK        7782    1982-01-23 00:00:00    1300    <NULL>    10


[CLEATE TABLE EMP とINSERT INTO EMP]

CREATE TABLE EMP
(EMPNO NUMBER(4) PRIMARY KEY NOT NULL, ENAME VARCHAR2(10) NOT NULL, JOB
VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(8), COMM
NUMBER(8), DEPTNO NUMBER(2));

INSERT INTO EMP VALUES (7379, 'SMITH', 'CLERK', 7902,
TO_DATE('1980-12-17', 'yyyy/mm/dd'), 400, NULL , 10);
INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698,
TO_DATE('1981-2-20', 'yyyy/mm/dd'), 400, 300 , 30);
INSERT INTO EMP VALUES (7521, 'WARD', 'SALESMAN', 7698,
TO_DATE('1981-2-22', 'yyyy/mm/dd'), 1250, 500 , 30);
INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER', 7839,
TO_DATE('1981-4-2', 'yyyy/mm/dd'), 2975, NULL , 20);
INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698,
TO_DATE('1981-9-28', 'yyyy/mm/dd'), 1250, 1400 , 30);
INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839,
TO_DATE('1981-5-1', 'yyyy/mm/dd'), 2580, NULL , 30);
INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839,
TO_DATE('1981-6-9', 'yyyy/mm/dd'), 2450, NULL , 10);
INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566,
TO_DATE('1987-4-19', 'yyyy/mm/dd'), 3000, NULL , 20);
INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL,
TO_DATE('1981-11-17', 'yyyy/mm/dd'), 5000, NULL , NULL);
INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698,
TO_DATE('1981-9-8', 'yyyy/mm/dd'), 1500, 0 , 30);
INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788,
TO_DATE('1987-5-23', 'yyyy/mm/dd'), 1100, NULL , 20);
INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698,
TO_DATE('1981-12-3', 'yyyy/mm/dd'), 950, NULL , 30);
INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566,
TO_DATE('1981-12-3', 'yyyy/mm/dd'), 3000, NULL , 20);
INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782,
TO_DATE('1982-1-23', 'yyyy/mm/dd'), 1300, NULL , 10);

COMMIT;



[最終的に表示したい形]
マネージャー    人数    最高給料    最低給料  マネージャー名
7566            2       3000        3000       JONES
7698            5       1500        400       BLAKE
7782            1        1300        1300      CLARK
7788             1       1100        1100      SCOTT
7839            3       2975        2450       KING
7902            1        400            400       FORD

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

そこまでできれいれば、マネージャ名を相関サブクエリでさくっと取得すれば簡単だと思います。

SELECT
  MGR AS マネージャー,
  COUNT(MGR) AS 人数,
  MAX(SAL) AS 最高給料,
  MIN(SAL) AS 最低給料,
  (
    SELECT ENAME FROM EMP E WHERE E.EMPNO = EMP.MGR
  ) AS マネージャー名 
FROM EMP
WHERE MGR IS NOT NULL
GROUP BY MGR
ORDER BY MGR ASC

http://sqlfiddle.com/#!4/ad325/1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/30 08:13

    みなさんありがとうございます。
    理解できました!

    キャンセル

0

こんにちは。
誤解があるかもしれませんが、
1例として下記のような方法があるかと思われます。

SELECT l.マネージャー, l.人数, l.最高給料, l.最低給料, m.ENAME AS マネージャー名
FROM (
SELECT MGR AS マネージャー, COUNT(MGR) AS 人数, MAX(SAL) AS 最高給料, MIN(SAL) AS 最低給料 
FROM EMP 
WHERE MGR IS NOT NULL 
GROUP BY MGR 
) AS l, EMP AS m
WHERE l.マネージャー = m.EMPNO
ORDER BY l.マネージャー ASC

動作までさせていないので
このまますんなり動くかはわかりませんが
上のような感じかと思われます。

語弊を恐れずにざっくりと説明しますと、
質問にご記載のグループ化したデータをlテーブルとして
そこにマネージャー名を抽出するためEMP AS mをくっつけます。
グループ化したl.マネージャーにくっつけたm.EMPNOが一致したら
m.ENAMEをマネージャー名として出力するという意図になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

これでどうでしょう?
SELECT
      MBR.MGR AS マネージャー
    , MBR.人数
    , MBR.最高給料
    , MBR.最低給料 
    , MNG.ENAME AS マネージャー名
FROM EMP MNG
JOIN(
    SELECT
          MGR
        , COUNT(MGR) AS 人数
        , MAX(SAL) AS 最高給料
        , MIN(SAL)  AS 最低給料
    FROM EMP 
    WHERE MGR IS NOT NULL 
    GROUP BY MGR
) MBR
ON MNG.EMPNO = MBR.MGR
ORDER BY MNG.MGR ASC 

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る