MySQLの練習問題を解いていてわからない問題があります。 以下問題
社員情報テーブル(member)と部署情報テーブル(division)から「部署名」と「部署の人数」を部署IDの昇順で出力してください。
member
カラム名 | 型 | 必須 |
---|---|---|
member_id | INT | yes |
name | VARCHAR(10) | yes |
division_id | VARCHAR(10) | yes |
division
カラム名 | 型 | 必須 |
---|---|---|
division_id | INT | yes |
division_name | VARCHAR | yes |
出力例
営業部 2
人事部 2
システム部 6
総務部 2
一応自分で以下のようなコードを書いたのですが
SQL
1select c.division_name as '部署名' ,count(*) as '部署の人数' 2from ( 3select name , division_name ,b.division_id 4from member as a 5join division as b 6on a.division_id = b.division_id 7) as c 8group by c.division_name;
どうしても部署ID順にする方法が分かりません。
order byで出来ればいいのですが、出力には部署IDがないのでエラーはかれまくりました。
selectで選んでいる項目以外でのソートはどうやるものなんでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
groupb by を指定した時のselect やorder by項目はgroup byに項目を指定しなければなりません。
SQL
1select a.division_name as '部署名', count(member_id) as '部署の人数' 2from division as a 3 inner join member as b 4 on a.division_id = b.division_id 5group by a.division_id, a.division_name 6order by a.division_id 7;
投稿2018/05/31 15:16
総合スコア25430
0
こんな感じでしょうか?
sql
1select 2 (select diision_name from division where division_id = c.division_id) as '部署名', 3 count(*) as '部署の人数' 4from 5 ( 6 select 7 name, 8 division_name, 9 b.division_id 10 from 11 member as a 12 join 13 division as b 14 on a.division_id = b.division_id 15 ) as c 16group by 17 c.division_id 18;
なお、一応SELECT句に入れていない列でも以下のように行が特定できるのであればソート自体は可能です。
sql
1-- 指定していないmember_idでのソート 2 3select name from member order by member_id;
今回の問題は、group by
との兼ね合いかと思います。division_name
でgroup by
した結果の各行はdivision_id
で特定できなくなっています。devision_id
もdivision_name
も性質上ユニークなのかもしれませんが、それはSQLで推測されないので、エラーになってるのかと思います。
投稿2018/05/31 14:15
総合スコア640
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/31 15:33
2018/06/01 00:52

0
memberのdivision_idが文字列型なのに対してなぜdivisionのdivision_idは数値型なのでしょう?
サンプル
SQL
1create table member( 2member_id INT, 3name VARCHAR(10), 4division_id INT); 5 6insert into member values 7(1,'aaa',101), 8(2,'bbb',101), 9(3,'ccc',102), 10(4,'ddd',102), 11(5,'eee',102), 12(6,'fff',103), 13(7,'ggg',103), 14(8,'hhh',103), 15(9,'iii',104); 16 17create table division( 18division_id INT, 19division_name VARCHAR(10)); 20 21insert into division values 22(101,'営業部'), 23(102,'人事部'), 24(103,'システム部'), 25(104,'総務部');
検索
SQL
1select t1.division_name,t2.c from division as t1 2inner join (select division_id,count(*) as c from member group by division_id) as t2 on t1.division_id=t2.division_id 3order by t1.division_id 4
投稿2018/05/31 14:16
総合スコア117732
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/31 15:28