• ベストアンサー

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文では無理なのでしょうか ? よろしくお願い致します。

  • Oracle
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
回答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

  • Oracl[10g]の SQL文について(No5)

    何度も恐縮です。また、違った事が出てきました。(^^; Oracl[10g]の 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 AAA A-2 2005/01/01 300 AAA A-2 2005/01/10 400 DDD A-2 2005/12/10 500 EEE と、します。 [B2]テーブルに [CODE2] と [NO] と [KIN2] フィールドがあるとします。 内容は、 AAA 1 1000 AAA 2 2000 DDD 1 3000と、します。 結果が、 A-1 NAME-1 300[B]テーブルの合計 3000[B2]テーブルの合計 A-2 NAME-2 1200[B]テーブルの合計 3000[B2]テーブルの合計 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? つまり、[CODE2]のフィールドを[B2]テーブルに反映させたいのです。 SELECT A.CODE,A.NAME,SUM(B.KIN),SUM(B2.KIN2) FROM A, B, B2 WHERE A.CODE=B.CODE AND B.CODE2=B2.CODE2 GROUP BY A.CODE,A.NAME ORDER BY A.CODE と、すれば、何故か A-1 NAME-1 600 6000 A-2 NAME-2 1000 6000 と、言う結果がでます。 これは、1つのSQL文では無理なのでしょうか ? よろしくお願い致します。

  • OraclのSQL文について(No2)

    前回の質問の続きとなります。 Oracl の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE] と [NOUKI] と [KIN] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 A-1 2005/01/02 200 A-2 2005/01/01 300 A-2 2005/01/10 400 A-2 2005/12/10 500 と、します。 結果が、 A-1 NAME-1 300 A-2 NAME-2 1200 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? SELECT A.CODE, A.NAME, B.KIN FROM A, B WHERE A.CODE = B.CODE ORDER BY A.CODE と、すると A-1 NAME-1 100 A-1 NAME-1 200 A-2 NAME-2 300 A-2 NAME-2 400 A-2 NAME-2 500 と、言う結果がでます。(当然ですが) しかし、 SELECT A.CODE, A.NAME, A2.KIN FROM A, A2 WHERE A.CODE = A2.CODE GROUP BY A.CODE,A.NAME ORDER BY A.CODE と、すると[GROUP BYの式ではありません]と、エラーになってしまいます。 (SUM文以前の問題でした) よろしくお願い致します。

  • Oracl[10g]の SQL文について(No.6)

    何度も恐縮です。前回の質問(例題)が間違えていました。 本当に申し訳ございません。改めて、お願いしたい次第です。 Oracl[10g]の SQL文について、教えて下さい。 [C1]テーブルに [CODE](key) と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE](key) と [NOUKI](key) と [KIN] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 A-1 2005/01/02 200 A-2 2005/01/01 300 A-2 2005/01/10 400 A-2 2005/12/10 500 と、します。 [C2]テーブルに [CODE2](key) と [NAME2] と [CODE] フィールドがあるとします。 内容は、 AAA NAME2-1 A-1 BBB NAME2-2 A-2 CCC NAME2-3 A-3 と、します。 [C3]テーブルに [CODE2](key) と [NO](key) と [KIN2] フィールドがあるとします。 内容は、 AAA 1 200 AAA 2 300 BBB 1 10 BBB 2 20 BBB 3 30 と、します。 結果が、 A-1 NAME-1 300[B]テーブルの合計 500[C3]テーブルの合計 A-2 NAME-2 1200[B]テーブルの合計 60[C3]テーブルの合計 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? 前回、教えて頂いた例を参考に頑張っているのですが、 まだ、私には難しすぎる様です。 よろしくお願い致します。

  • SQL文の書き方

    SQL文の書き方を教えて下さい。 以下の2つのクエリー(1のクエリー&2のクエリー)を1つのクエリーで1度に抽出をかけたいのですがSQL文の書き方がわかりません。 データの発生条件としては TableBのField1は必ずTableAのField1に存在するという条件です。 TableAのField1が「AAA」から「EEE」まである場合は、TableBのField1も必ず「AAA」から「EEE」の範囲内で発生します。 よろしくお願い致します。 1のクエリー ---------------------------------------------------------------- TableA Field1 ---------------------------------------------------------------- AAA AAA AAA BBB BBB CCC DDD DDD EEE EEE EEE ---------------------------------------------------------------- Field1をサマライズしてカウントと名称を取得するクエリー Select Count(TableA.Field1) as RecCount, TableA.Field1 From TableA 結果 RecCount  Field1 3      AAA 2      BBB 1      CCC 2      DDD 3      EEE ---------------------------------------------------------------- 2のクエリー ---------------------------------------------------------------- TableB Field1 ---------------------------------------------------------------- BBB CCC CCC EEE ---------------------------------------------------------------- Field1をサマライズしてカウントと名称を取得するクエリー Select Count(TableB.Field1) as RecCount, TableB.Field1 From TableB 結果 RecCount  Field1 1      BBB 2      CCC 1      EEE ---------------------------------------------------------------- 希望する結果 TableAのRecCount TableBのRecCount TableAのField1 3                   AAA 2         1         BBB 1         2         CCC 2                   DDD 3         1         EEE

  • SQL文を教えてください。

    すみません、SQLを教えてください。 ID, 名前の2つのフィールドを持つテーブルがあります。 中身は以下のように入っています。 1, AAA 2. AAA 2, BBB 3, CCC 3, AAA 4, DDD 5, EEE, 5, DDD これを、名前のダブリをスキップしながら、 IDの大きな順番に名前を取り出したいのです。 結果は、以下のようになればいいです。 DDD EEE AAA CCC BBB どのようなSQLを組んだら実現できますか? よろしくお願いいたします。

  • Oracl[10g]の SQL文について(No.7)

    何度も本当に恐縮です。自力で頑張ろうと思いましたが無理でした。(;_;) Oracl[10g]の SQL文について、教えて下さい。 [A]テーブルに [CODE](key) と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [A2]テーブルに [NO](key) と [CODE1] と [KIN1] と [CODE2] と [KIN2] フィールドがあるとします。内容は、 1 A-1 100 (null null) 2 A-1 10 A-3 300 3 A-2 20 A-1 10 4 A-3 5000 A-1 20 と、します。 5 A-3 500 結果が、 A-1 NAME-1 110[A2]テーブル[KIN1]の合計 30[A2]テーブル[KIN2]の合計 A-2 NAME-2 20[A2]テーブル[KIN1]の合計 0(null) A-3 NAME-3 5500[A2]テーブル[KIN1]の合計 300 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? SELECT A.CODE, A.NAME, SUM(A2.KIN1) AS KIN1, SUM(A2.KIN2) AS KIN2 FROM A,A2 WHERE A2.CODE1=A.CODE OR A2.CODE2=A.CODE GROUP BY A.CODE, A.NAME と、すると何故か A-1 NAME-1 5130 330 A-2 NAME-2 20 10 A-3 NAME-3 5510 320 と、言う結果になってしまいます。 よろしくお願い致します。

  • Oracl[10g] の SQL文について(No.4)

    何度も恐縮です。また、違った事が出てきました。(^^; Oracl[10g] の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 B-1 NAME-3 と、します。 条件は、[CODE]の左1文字が’A’の物のみを取り出したいのです。 要するに、結果が、 A-1 NAME-1 A-2 NAME-2 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? SELECT A.CODE,A.NAME, WHERE LEFT(A.CODE,1)='A' GROUP BY A.CODE,A.NAME ORDER BY A.CODE と、すればエラーになってしまいます。 よろしくお願い致します。

  • Oracl の SQL文について

    Oracl の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE] と [DATE] と [MONEY] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 A-1 2005/01/02 200 A-2 2005/01/01 300 A-2 2005/01/10 400 A-2 2005/12/10 500 と、します。 [DATE]の条件を、2005/01/01~2005/01/31とし、結果を A-1 NAME-1 300 A-2 NAME-2 700 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? よろしくお願い致します。

  • SQLについて

    aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 111 111 111 111 111 111 111 112 112 112 112 112 112 111 112 113 113 113 113 113 111 114 114 114 114 114 114 111 114 114 114 114 114 114 112 114 115 115 114 114 115 111 114 115 115 114 114 115 112 116 116 116 116 116 116 111 116 116 116 116 116 116 112 116 116 116 116 116 117 111 116 116 116 116 116 117 112 118 118 118 118 118 118 118 上記のようなデータより、SQLのSELECTを使用して、以下のように抽出したいです。 抽出条件は以下が全て満たしているものとなります。 ・aaa,ccc,ddd,eee,gggが重複、hhhが小さいもの ・bbbが異なるもの aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 112 112 112 112 112 112 111 ・・・(1) 112 113 113 113 113 113 111 ・・・(1) 114 114 114 114 114 114 111 ・・・(2) 114 115 114 114 114 115 111 ・・・(2) (1)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象 (2)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象  また、hhhが小さいもの 以上、よろしくお願いします。

  • Oracl[10g]の SQL文について(No.7)

    何度も恐縮です。また、違った事が出てきました。(^^; 皆様にとっては、似たような事ばかりかと思いますが・・・ Oracl[10g]の SQL文について、教えて下さい。 [A]テーブルに [CODE](key) と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [A2]テーブルに[NO](key) [CODE1] と [CODE2] と [CODE3]フィールドがあるとします。 内容は、 1 A-1 A-2 (null) 2 A-2 A-1 A-3 3 (null)A-3 A-2 と、します。 結果が、 1 A-1 NAME-1 A-2 NAME-2 (null) (null) 2 A-2 NAME-2 A-1 NAME-1 A-3 NAME-3 3 (null/null)A-3 NAME-3 A-2 NAME-2 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? SELECT A1x.CODE1,A.NAME,A2x.CODE2, A.NAME,A3x.CODE3, A.NAME FROM A, (SELECT A.CODE, A.NAME, A2.CODE1 FROM A,A2 WHERE A.CODE=A2.CODE1 GROUP BY A.CODE,A.NAME,A2.CODE1) A1x, (SELECT A.CODE, A.NAME, A2.CODE2 FROM A,A2 WHERE A.CODE=A2.CODE2 GROUP BY A.CODE,A.NAME,A2.CODE2) A2x, (SELECT A.CODE, A.NAME, A2.CODE3 FROM A,A2 WHERE A.CODE=A2.CODE3 GROUP BY A.CODE,A.NAME,A2.CODE3) A3x WHERE A.CODE=A1x.CODE1 AND A.CODE=A2x.CODE2 AND A.CODE=A3x.CODE3 と、自分でチャレンジしたのですが、何も出てきません。 よろしくお願い致します。