SQLの基本操作の一つである「group by」を、理解できていませんね。
基本操作から、しっかり勉強すべきです。
>実はgroup by も試してみたのですが、どうもうまくいきません。
>とりあえず、下記のようなSQLを書いてみました。
>select name,max(amount),customer
>from test.deal,test.person
>where person.id=deal.person_id
>group by name
>order by max(amount) desc
理解できていないまま、いい加減なことをやっていますよ?
> ERROR: column "deal.customer" must appear in the GROUP BY clause or be >used in an aggregate function;
>言われるままに、group byの中にcustomerを入れると下記のような結果に
>なり、group byを付けても付けなくても同じになります
エラーの内容を取り違えて、デタラメな対処を行っていますよ?
>group by を使用するとして、名前の重複を避けるにはどのようにしたら
名前の重複を起こさない(つまり、どのデータを活かすか?)が、不明瞭だし、SQLとして指定されていないのですよ。
どうしたい(どのデータを活かしたい)のですか?
また、得たい結果(仕様)で、まだまだ不明瞭な点があります。
person_id毎に、最大のamountを得るのは簡単です。
しかし、同じperson_idで求めた最大のamountが、二箇所以上のcustomerで記録されていた場合、どういう結果を得たいのでしょうか?
理解できていないのに、デタラメの上にさらにデタラメを繰り返すのでなく、簡単なクエリから順次、組み立てていきましょう。
今回のクエリは、次の(1)~(3)の順に組み立てていくと、具体的な仕様が明確でない部分が明確になり、SQLの理解も進むと思います。
(1)test_deal表で、person_id毎に最大のamountを得る
(2)(1)に該当するtest_deal表のidを得る
→全idとするのか、最大のidあるいは最小のidとするのか、仕様の明確化が必要
(3)(2)のidと、test_person表を結合する
#4回答の1箇所訂正。
<訂正前>
(3)(2)のidと、test_person表を結合する
↓
<訂正後>
(3)(2)のidの行のperson_idと、test_person表を結合する
=====以下、独り言=====
select
person_id,max(amount)
from test_deal
group by person_id
;
select
*
from test_deal as d
where id=(select min(id)
from test_deal
where d.person_id=person_id
having d.amount=max(amount)
)
order by id
;
select
*
from test_person as p
inner join (
select
*
from test_deal as d
where id=(select min(id)
from test_deal
where d.person_id=person_id
having d.amount=max(amount)
)
) as x
on p.id=x.person_id
order by p.id
;
質問者
お礼
すばらしいです。これは難しいんじゃないかと思っていたので、正直いって驚きました。
実は質問を投稿する前から、これはgroup by で解決できそうに見えて実はそうじゃない、というパターンじゃないかという気がしていました。ですが相関サブクエリなどをちょっと書いてみても、どうもいい方法が思いつかないので質問させていただいた次第です。
group by なしの having というのはまだあまり勉強していないところなので、これを機に調べてみたいと思います。
SQLの奥の深さを改めて教えていただいた気分です。本当にありがとうございました。
ありがとうございます。
実はgroup by も試してみたのですが、どうもうまくいきません。
とりあえず、下記のようなSQLを書いてみました。
select name,max(amount),customer
from test.deal,test.person
where person.id=deal.person_id
group by name
order by max(amount) desc
すると、下記のようなエラーになります。
> ERROR: column "deal.customer" must appear in the GROUP BY clause or be used in an aggregate function;
言われるままに、group byの中にcustomerを入れると下記のような結果になり、group byを付けても付けなくても同じになります
name | max | customer
------+-------+----------
山田 | 20000 | XX商事
田中 | 10000 | BB電機
山田 | 8000 | RR証券
高橋 | 2000 | ZZ不動産
group by を使用するとして、名前の重複を避けるにはどのようにしたらよろしいでしょうか。
よろしくお願いいたします。
お礼
すばらしいです。これは難しいんじゃないかと思っていたので、正直いって驚きました。 実は質問を投稿する前から、これはgroup by で解決できそうに見えて実はそうじゃない、というパターンじゃないかという気がしていました。ですが相関サブクエリなどをちょっと書いてみても、どうもいい方法が思いつかないので質問させていただいた次第です。 group by なしの having というのはまだあまり勉強していないところなので、これを機に調べてみたいと思います。 SQLの奥の深さを改めて教えていただいた気分です。本当にありがとうございました。