• ベストアンサー

OraclのSQL文について(No3)

何度も恐縮です。また、違った事が出てきました。(^^; Oracl の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE] と [NOUKI] と [KIN] と [CODE2] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 AAA A-1 2005/01/02 200 BBB A-2 2005/01/01 300 CCC A-2 2005/01/10 400 DDD A-2 2005/12/10 500 EEE と、します。 結果が、 A-1 NAME-1 300 AAA A-2 NAME-2 1200 CCC と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? つまり、[CODE2]のフィードは一番最初を表示させたいのです。 SELECT A.CODE, A.NAME, B.CODE2, SUM(B.KIN) FROM A, B WHERE A.CODE = B.CODE GROUP BY A.CODE, A.NAME,B.CODE2 ORDER BY A.CODE と、すれば A-1 NAME-1 AAA 100 A-1 NAME-1 BBB 200 A-2 NAME-2 CCC 300 A-2 NAME-2 DDD 400 A-2 NAME-2 EEE 500 と、言う結果がでます。(当然ですが) これは、1つのSQL文では無理なのでしょうか ? よろしくお願い致します。

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

  • ベストアンサー
回答No.3

#8iエンタープライズor9iスタンダード以降 SELECT A.CODE,A.NAME,max(decode(R,1,Bx.CODE2)),SUM(Bx.KIN) FROM A,(SELECT B.*,ROW_NUMBER() OVER(PARTITION BY CODE ORDER BY NOUKI) R FROM B) Bx WHERE A.CODE=Bx.CODE GROUP BY A.CODE,A.NAME ORDER BY A.CODE 一行目(エラーの箇所)でパンチミスしてました。

m-toshi
質問者

お礼

ありがとうございます。無事に実行できました。 これを、実際のデータに組み込むのかと考えると かなり、つらいですが、頑張ります。 今後とも宜しくお願い致します。

その他の回答 (2)

回答No.2

まずは.. >#1 一番最初のCODE2をmin(CODE2)と解釈するのであれば、サブクエリは要らない。 というか、min(CODE2)を一番最初のレコードのCODE2と考えるのが少し乱暴かと。 で、本題ですが.. お使いのバージョンとエディションが、毎度書かれていないので、 余り回答する元気が出ないのですが.. #8iエンタープライズor9iスタンダード以降 SELECT A.CODE,A.NAME,max(decode(R,1,B.CODE2)),SUM(Bx.KIN) FROM A,(SELECT B.*,ROW_NUMBER() OVER(PARTITION BY CODE ORDER BY NOUKI) R FROM B) Bx WHERE A.CODE=Bx.CODE GROUP BY A.CODE,A.NAME ORDER BY A.CODE #8i以降 SELECT A.CODE,A.NAME,BX.CODE2,SUM(Bx.KIN) FROM A,B, (select CODE,CODE2 from (select CODE,CODE2,ROENUM R from (select * from B order by CODE,NOUKI)) where R=1) BX WHERE A.CODE=B.CODE and A.CODE=BX.CODE GROUP BY A.CODE,A.NAME ORDER BY A.CODE #8iより前 SELECT A.CODE,A.NAME,BX.CODE2,SUM(Bx.KIN) FROM A,B, (select CODE,CODE2 from (select CODE,CODE2,ROENUM R from (select destinct B.*,ROWID from B)) where R=1) BX WHERE A.CODE=B.CODE and A.CODE=BX.CODE GROUP BY A.CODE,A.NAME ORDER BY A.CODE 他にも色々考えられるけど、面倒なので、思いついたモノを一つずつ書きました。 (全てのSQL共にテストしてません)

m-toshi
質問者

補足

>一番最初のCODE2をmin(CODE2)と解釈するのであれば、サブクエリは要らない。 >というか、min(CODE2)を一番最初のレコードのCODE2と考えるのが少し乱暴かと。 はい、そう思います。ただ、出来ない事はないような気がするのです。 >お使いのバージョンとエディションが、毎度書かれていないので、 >余り回答する元気が出ないのですが.. すみません。「10g」です。 >#8iエンタープライズor9iスタンダード以降 >SELECT A.CODE,A.NAME,max(decode(R,1,B.CODE2)),SUM(Bx.KIN) >FROM A,(SELECT B.*,ROW_NUMBER() OVER(PARTITION BY CODE ORDER BY >NOUKI) R FROM B) Bx >WHERE A.CODE=Bx.CODE >GROUP BY A.CODE,A.NAME >ORDER BY A.CODE で、実行させていただきました。が、[“B”.”CODE2”:無効な識別子です]と、何故かエラー が発生してしまいました。 >他にも色々考えられるけど、面倒なので、思いついたモノを一つずつ書きました。 >(全てのSQL共にテストしてません) ご面倒をお掛けして申し訳ございません。 出来れば、続けてご指導をお願い致します。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

select tblA.CODE, tblA.NAME, tblB.KIN, tblC.CODE2 from A as tblA, (select CODE, sum(KIN) as KIN from B group by CODE) as tblB, (select CODE, min(CODE2) as CODE2 from B group by CODE) as tblC where tblA.CODE = tblB.CODE and tblA.CODE = tblC.CODE ; でどうでしょう? 試験してないので、自信なし。

m-toshi
質問者

補足

ご回答をありがとうございます。教えて頂いたSQL文を早速、実行してみました。 が、「SQLコマンドが正しく終了されていません」とエラーが発生しました。 >select tblA.CODE, tblA.NAME, tblB.KIN, tblC.CODE2 疑問は、ここの部分なのですが、どうして[tblC]が出てくるのでしょうか? >from A as tblA, これを、[from A as tblA, B as tblB, A as tblC]と、書き換えてみましたが、 やはり、エラーになってしまいます。 ご無理を言って申し訳ございませんが、続いてご指導をお願い出来ないでしょうか? 宜しくお願い致します。

関連するQ&A