• ベストアンサー

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" としたらエラー「要求された名前、または序数に対応する項目がコレクションで見つかりません」 と出てしまいます。 データベースはオラクルです。 正しい書き方を教えて下さい。

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

  • ベストアンサー
  • yoshisuke
  • ベストアンサー率65% (19/29)
回答No.3

もっと良い方法があるような気がしますが。。。 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 って感じで動きました。 あんまり速くなさそうですね(^^ゞ 参考になれば、幸いです。

moon45_poo
質問者

お礼

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

moon45_poo
質問者

補足

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

その他の回答 (3)

  • eipu
  • ベストアンサー率39% (25/64)
回答No.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の後ろに半角スペース入れてます)

moon45_poo
質問者

補足

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

  • yoshisuke
  • ベストアンサー率65% (19/29)
回答No.2

項目「qq」の値は最新の日付が格納されているレコードがNULL の場合は他のレコードから補完する必要があるということでしょうか? 補完する場合は基準についてもう少し教えてください。

moon45_poo
質問者

補足

申し訳ございません。データを間違えました。 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 の場合、他のレコードから補完する必要はありません。

  • funamin
  • ベストアンサー率0% (0/6)
回答No.1

select * from abc where (x,y,z,date) = (select x,y,z,max(date) from abc group by x,y,z ) これでは、だめでしょうか?? 実際今、環境がないので確認できないのですが・・。

moon45_poo
質問者

補足

ありがとうございます。 *------------------------- "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難しいです。。