こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQL初心者のため、初歩的な質問だと思いますが、回答お願いします。

SQL初心者のため、初歩的な質問だと思いますが、回答お願いします。

●健康診断テーブル
ID 回数 結果
―――――――
A  1  11
B  1  22
B  2  23
C  1  11
C  2  22
C  3  12
D  1  12
E  1  31

●個人情報テーブル
ID 所属 
―――――
A  経理 
B  総務 
C  営業 
D  営業
E  経理

上のような二つのテーブルがあります。
IDは人物の識別に使うIDで、同じIDなら同じ人を表しています。
健康診断テーブルの結果は、回数を重ねると変わってしまうこともあります。
この二つのテーブルから、所属ごとの結果を表示したいです。
上記の場合、以下のようなデータを出力できるようにしたいです。

所属 結果 人数
―――――――――
経理 11  1
経理 31  1
総務 23  1
営業 12  2

どのようにプログラムを組めばいいのでしょうか。
グーグル等で検索しても、自分の理解できる解答は見つかりませんでした。
(自分のプログラムレベルがかなり酷く、わからないがわからないのレベルです)

今は初回・2回・3回と回数を変更するSQL文は作成できています。
すいませんが、回答お願いします。

投稿日時 - 2009-12-20 09:32:05

QNo.5535229

困ってます

質問者が選んだベストアンサー

間違ってるので訂正。

select B.所属,A.結果,count(*) as "人数"
from
(
select x.*,row_number() over(partition by ID order by 回数 desc) R
from 健康診断テーブル x
) A,
個人情報テーブル B
where R=1 and A.ID=B.ID
group by B.所属,B.結果
;

投稿日時 - 2009-12-20 12:53:06

お礼

動きました!!本当にありがとうございます。
内容も間違っていないようなので一安心してました。
かなり複雑に見えます、どういう動きをしているかは後で勉強してみます。

投稿日時 - 2010-01-01 04:39:08

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(4)

自分が書くなら、探査が各1回ずつで済むので、こんな感じかな・・

select B.所属,count(*)
from
(
select x.*,row_number() over(partition by ID order by 回数 desc) R
from 健康診断テーブル x
) A,
個人情報テーブル B
where R=1 and A.ID=B.ID
group by A.ID,B.結果
;

投稿日時 - 2009-12-20 12:48:43

ANo.2

select
A.所属, B.結果, count(*) as 人数
from
個人情報 A,
健康診断 B
where
A.ID = B.ID
and
B.回数 = (select max(回数) from 健康診断 C where C.ID = B.ID)
group by
A.所属, B.結果

こんな感じじゃないですか

投稿日時 - 2009-12-20 12:22:26

お礼

ありがとうございます。これが一番簡単な方法だと思いました。
このような発想すら浮かばないくらい、初心者かつ不向きな脳内なので大変です。
ただ、なぜかこの方法でも動きませんでした。
説明不足で申し訳ありません。

投稿日時 - 2010-01-01 04:37:56

ANo.1

select 所属,結果,count(id) 人数 from 健康診断テーブル natural join 個人情報テーブル group by 所属,結果
試してないですが、こんな感じではどうでしょう?

投稿日時 - 2009-12-20 10:20:39

お礼

ありがとうございます。
ナチュラルジョインというのがあるのですね、勉強になります。
ただこれではうまくいきませんでした。
説明不足だったと思います。申し訳ありません。

投稿日時 - 2010-01-01 04:36:31

あなたにオススメの質問