みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

SQLでMAXを使った

□オラクルのデータ(テーブル名:abc)
-------------------------------------------------
列名 x y z date qq
-------------------------------------------------
a a a 2003/12/1 a
b b b 2003/01/01 b
a a a 2003/12/14
b b b 2005/12/30

□結果
-------------------------------------------------
列名 x y z date qq
-------------------------------------------------
a a a 2003/12/14 a
b b b 2005/12/30 b


上の結果を出したい時、SQLで
"SELECT x,"_
   & "y," _
   & "z," _
   & "Max(date) AS abc2, qq FROM abc" _
   & "GROUP BY x," _
   & "y," _
   & "z," _
& "qq"
としたらエラー「要求された名前、または序数に対応する項目がコレクションで見つかりません」
と出てしまいます。
データベースはオラクルです。
正しい書き方を教えて下さい。

投稿日時 - 2003-03-14 14:01:18

QNo.497850

すぐに回答ほしいです

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

もっと良い方法があるような気がしますが。。。

select a.x,a.y,a.z,a.date,a.qq from abc a,
(select x,y,z,max(date) wdate from abc group by x,y,z) b
where a.x=b.x and a.y=b.y and a.z=b.z and a.hiduke=b.wdate

って感じで動きました。
あんまり速くなさそうですね(^^ゞ

参考になれば、幸いです。

投稿日時 - 2003-03-14 16:00:13

補足

ありがとうございます!
早速挑戦しているのですが、私の記述が悪いのか
なかなかうまくいきません。
もう少し頑張ってみます。

投稿日時 - 2003-03-14 19:15:33

お礼

とても勉強になりました。
ご丁寧な解答、助かりました。
ありがとうございました。

投稿日時 - 2003-03-18 11:24:29

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

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

回答(4)

ANo.4

環境が無いので確認はしてませんが、

>"SELECT x,"_
>   & "y," _
>   & "z," _
>   & "Max(date) AS abc2, qq FROM abc" _
>   & "GROUP BY x," _
>   & "y," _
>   & "z," _
>& "qq"

のうち

"Max(date) AS abc2, qq FROM abc" _

の部分を

"Max(date) AS abc2, qq FROM abc " _

としてやれば動くんじゃないでしょうか?
(abcの後ろに半角スペース入れてます)

投稿日時 - 2003-03-15 00:14:34

補足

解決しました。
MAX関数を使った場合、表示する項目名をAS以降の自分で付けた名前にしなければならないということを知りませんでした、、。
色々試すだけで、よく分からないでやると、こういう事になるんですね。

どうもありがとうございました。

投稿日時 - 2003-03-18 11:17:33

ANo.2

項目「qq」の値は最新の日付が格納されているレコードがNULL
の場合は他のレコードから補完する必要があるということでしょうか?

補完する場合は基準についてもう少し教えてください。

投稿日時 - 2003-03-14 14:47:31

補足

申し訳ございません。データを間違えました。
table name : abc
-------------------------------------------------
x y z date       qq
-------------------------------------------------
a a a 2003/12/01  a
b b b 2003/01/01  b
a a a 2003/12/14  a
b b b 2005/12/30  b
-------------------------------------------------
です。NULL の場合、他のレコードから補完する必要はありません。

投稿日時 - 2003-03-14 14:57:25

ANo.1

select * from abc
where (x,y,z,date)
=
(select x,y,z,max(date) from abc
group by x,y,z
)

これでは、だめでしょうか??
実際今、環境がないので確認できないのですが・・。

投稿日時 - 2003-03-14 14:32:41

補足

ありがとうございます。
*-------------------------
"SELECT * FROM abc WHERE (x, y, z, date, qq)
=
(SELECT x, y, z, MAX(date), qq FROM abc GROUP BY x, y, z, qq)"
*-------------------------
としましたが、エラーになってしまします。。

結果の記述も悪かったので、もう一度書かせて頂きます。
----------------------------
x y z date       qq
----------------------------
a a a 2003/12/14  a
b b b 2005/12/30  b
----------------------------
です。
単純に、重複するものを表示しないで「date」が最大値のものを表示するようにしたいだけなのですが、SQL難しいです。。

投稿日時 - 2003-03-14 15:36:03

あなたにオススメの質問