• ベストアンサー

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難しいです。。

関連するQ&A

  • SQL文で質問です

    SQL文で質問です。 テーブルA X NUMBER型 Y DATE型(年月日と時間) テーブルB Z NUMBER型 W DATE型(年月日) A,BをAを主テーブルとして外部結合し、同じ年月日でBには無いデータ を取得したいのですが、 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND A.Y = B.W(+) AND B.Z IS NULL; というSQL文を実行すると、テーブルAには時間まで登録されているので 実際には取得したいデータが存在しても 「レコードが選択されませんでした」 になってしまいます。このため、 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND TO_DATE(A.Y,'YYYY/MM/DD') = TO_DATE(B.W,'YYYY/MM/DD')(+) AND B.Z IS NULL; としてみたところ、今度は3行目で 「ORA-00936: 式がありません」 というエラーになってしまいます。 外部結合にしたことがエラーの原因のようなのですが、DATE型の項目を キーにして外部結合にするにはどうすれば良いのでしょうか?

  • SQLを教えてください

    単純そうなのですがSQLが分かりません。 次のような2つのテーブルがあるとします。 TableA ( a VARCHAR2(2) b VARCHAR2(30) ) TableB ( x VARCHAR2(2) y VARCHAR2(30) z1 VARCHAR2(2) z2 VARCHAR2(2) z3 VARCHAR2(2) z4 VARCHAR2(2) z5 VARCHAR2(2) ) この時にTableBはTableAのグループみたいなものでz1からz5までがTableAのaが登録されています(NULLの場合もあります)。ここでTableBの内容を表示するときに x, y, b1, b2, b3, b4, b5 と出力したいのです。 すみませんがよろしくお願いします。

  • 片方だけ抽出する方法(SQL)

    下記のようなテーブルがあるとします。 Aテーブル コード 値 X 10 Y 20 Z 30 Bテーブル コード 値 Y 20 Y 30 Z 30 A.コード=B.コードとA.値=B.値という条件に一致しないデータのうち、 Aテーブルのデータのみ取り出したいです。 この場合だと、「X 10」のみ結果として欲しいです。 どのようなSQLを作成すればいいか、分かりません。 考え方の問題なのかもしれませんが、ぜひ教えてください。

  • 2つの情報を1つのSQLで取得する方法について

    お世話になります。 SQL文で、下記内容のデータを取得する方法がわかりません。 ・TESTテーブルからA、B、Cの3項目のデータを取得する。 ・但し、この中のC項目については、WHERE句の条件を満たす データの最大値を取得する。 ・項目AおよびBの取得条件は、項目Cと同一条件とする。 ・目的は、項目AおよびBに関しては、WHERE句の条件を満たす  全てのレコードを取得し、項目Cにおいては最大値のみ取得したい。 上記内容を取得しようと考えた場合、 現時点で下記のSQL文を作成して実行しましたが、 うまくデータが取得できません。 SELECT A, B, C FROM TEST WHERE C = (SELECT MAX(C) FROM TEST) AND Z = 'xxxxx' AND Y = 'x' AND X = 'Y' ※項目X, Y, ZはTESTテーブルのカラムです ※上記SQLを、A、Bのみ取得用とCのみ取得用に   それぞれ分解して実行すると、それぞれの結果は   正常に取得できます。 2つの結果を1つのSQLで取得することは可能でしょうか? どなたかご教授願えますか?よろしくお願いいたします。

  • 因数分解

    (X-Z)3+(Y-Z)3-(X+Y-2Z)3 が分かりません。 X-ZをA、Y-ZをB、-X-Y+2ZをCとおいて、 A3+B3+C3、 a3+b3+c3-3abc=(a+b+c)(a2+b2+c2-ab-bc-ca)という公式を使うために、 A3+B3+C3-3ABC+3ABCとして、+3ABCを後ろに置いて公式を当てはめる所までは分かってます。 でもそこから先が全くわかりません。 答えは-3(X-Z)(Y-Z)(X+Y-2Z)で、半角数字は三乗です。 ご回答宜しくお願いします

  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

  • 因数分解

    (x-y)^2+(y-z)^2+(z-x)^2 x-y=a,y-z=b,z-x=cとしています。 を因数分解するんですが、 (a+b+c)(a^2+b^2+c^2-ab-bc-ca)+3abc() まで計算できました。その後の =3abc になるらしいんですが、なぜ3abcになるのかわかりません。 どなたかおしえてください。

  • PL/SQLでPLS-00201のエラー

    初めて質問させていただきます。 よろしくお願いいたします。 Oracle 9i から 11g へバージョンアップしました。 9iでは動いていたPL/SQLコマンドが11gでは 以下のようなエラーが大量に発生します A_FLG Aシノニム名.列名%type ,      * 行16でエラーが発生しました ORA-00201:行16、列13: PLS-00201:識別子(シノニム名).(列名)を宣言してください。 PROCEDURE D_FLG_UPD ( a in varchar2 ) is type D_TYPE is record ( J シノニム名.列名.列名%type ,    ここでエラー   → A_FLG Aシノニム名.列名%type , B_FLG Bシノニム名.列名%type , C_FLG Cシノニム名.列名%type ); G H; begin これはどういった場合に発生するエラーなのでしょうか? またOracleのバージョンによってPL/SQLのコマンドが動かなくなったりすることは よくあることなのでしょうか? よろしくお願いいたします。

  • SQL GROUPで件数の一番多いレコードのみ取る

    SQL GROUPで件数の一番多いレコードのみ取る ORACLE10です。 次のようなテーブルがあります。 USER -----------テーブル名 ID,NAME,DATA----列名 1,A,any 1,A,any 1,B,any 2,C,any 3,D,any このテーブルから、IDをGROUPにして、さらに、一番使用頻度の多いNAMEを取得したいのです。 表示したいのは、IDとNAMEです。 つまり、取得結果例は次のようになります。 取得結果例 ID,NAME----列名 1,A 2,C 3,D SQL文をどのように作れば可能でしょうか? ちなみに、IDやNAMEのマスタテーブルはありません。 自分では、「(select ID, NAME, count(*) from USER group by ID, NAME) COUNT」で、COUNTを内部テーブルにして、グループ内で一番多いcount(*)をmaxで取得してみようかと思ったんですが、そこからアイデアが出ませんでした。

  • Oracle 10.2.0 でMAX集計がおかしい!?

    VB6 で oo4o を使って Oracle DB開発をしています。 Oralce 8.1.6 から Oracle10.2.0 にサーバを切り替えました。 bというテーブルがあって、 a c d ---- ------ ----- 10 2 1 20 3 1 30 4 1 40 5 1 50 6 2 というデータがあったとします。 Select MAX(a) as a from b WHERE d=1 のようなSQLをVBから発行したときに SQL*PLUSでは、 a ---- 40 という結果が返ってくるのですが、VBでは、 a --- 10 20 30 40 のように複数行のレコードセットが帰ってきます。そのため、最大行を取得できません。Oracle8 のときは、SQL*PLUSと同じ結果が返ってきていました。ちなみに Select MAX(a) as a from b WHERE d=1 GROUP BY d ~~~~~~~~~~ と、GROUP BYを付けると、ただしい(SQL_PLUSと同じ値)値が取得できます。 Oracle10.2.0の問題か、oo4oの問題かと考えています。 ちなみにoo4oのオブジェクトは、 CreateObject("OracleInProcServer.XOraSession") で作成していて、クライアントのバージョンは 9.2.0.4.4です。 長文で失礼しますが、どなたかSQLを変更せずに解決する方法をご存じないでしょうか?

専門家に質問してみよう