• ベストアンサー

Oracle8iでの集合関数SQL

Oracle初心者です。お願いいたします。 Oracle8iに、VB6で接続するアプリですが、 番号 列名  ID  概要     金額 0001 品川  10  駅が広い   10000 0002 渋谷  10  繁華街    15000 0003 川崎  12  新開発地   30000 0004 池袋  13  旧市街    18000 0005 神田  12  本屋街    40000 0006 上野  10  食品街     500 ひとつのSQL文で、上記のような表の、同一のID列ごとにまとまった、金額の合計を求めるのですが、番号・列名・概要は、その“番号”のもっとも大きな番号の値を表示したいのです。ACCESSであれば、列に“First”を使用すればできるのですが、Oracle8iだと、わかりません。 欲しい表示は、 番号 列名  ID  概要     金額 0006 上野  10  食品街    25500 0005 神田  12  本屋街    70000 0004 池袋  13  旧市街    18000 同様なSQLが他にもあり、最終的に、3~6個のSQLを、 Unionで一本化するのですが、元になるSQLがつくれません。 どなたか、よろしくお願いいたします。 by mictic

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

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

  • ベストアンサー
  • tomoarai
  • ベストアンサー率31% (15/48)
回答No.1

誰かもっとすっきりしたものを考えてくれ select 最大番号, 列名, ID, 概要, 合計金額 from 表, (select ID, sum(金額) as 合計金額 from 表 group by ID) A, (select ID, max(番号) as 最大番号 from 表 group by ID) B where 表.ID=A.ID and 表.ID=B.ID and 表.番号=B.最大番号;

その他の回答 (2)

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.3

#2さんと同じですが、8iではエイリアスのASは効かなかったと思われ。 もし、エラーになったらこちらで。 select a.番号,a.列名,a.ID,a.概要,b.金額 from テーブル a, (select ID,sum(金額) "金額",max(番号) "番号" from テーブル group by ID) b where a.番号 = b.番号 order by a.ID

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

「番号」は主キーでしょうか? Oracleが手元に有りませんので確認できませんが、「番号」が主キー、または、NULL無しのユニークな値だと仮定して、下記の様なクエリではどうでしょうか。 SELECT a.番号, a.列名 a.ID a.概要 b.合計金額 FROM 元の表 AS a, (SELECT MAX(番号) AS 番号, SUM(金額) AS 合計金額 FROM 元の表 GROUP BY ID) AS b WHERE a.番号 = b.番号 ORDER BY a.ID

関連するQ&A

  • SQL文の関数らしいのですが、意味を正確に調べたいとき。

    Visual Basic で組んだ業務ソフトのソースを見ているところなのですが…。データベースは SQL Serverを使っています。その中のコードとして SQL = "SELECT * FROM MPGSUB " _ & "WHERE 端末ID = " & Conv_DBValue(Client_ID, DB_String) というのがあります。これは、《"端末ID"列から、DB_Stringの型に変換した値をClient_ID という列名にして取得する》ということで良いのでしょうか。 Conv_DBValue やDB_String は、手元の辞典にも載っていないし、ネットで検索しても解説しているところがありません。このようなときは、プログラムで参照すべき他のモジュールが足りないと考えた方が良いのでしょうか。 ときどき調べがつかない関数があるので困ってしまうので、そのような時はどうすべきか教授願いたいです。(^^;

  • 列名の取得方法は?

    VB6.0 ORACLE10g Win20003Server WinXP開発 よろしくお願いします。 列名(フィールド名称)を取得する方法(SQL)がありましたら、お願いします。 データの内容はわかるんですが、列名(どの列に入っているのか)を知りたいと思っています。 よろしくお願いします。

  • DB2のSQL

    select * from xTABLE where EMP_ID = "P001" というSQLを実行すると SQL0206N "P001" is not valid in the context where it is used. SQLSTATE=42703 のエラーが出ます。 SQLSTATEで調べても「"P001"の列がテーブルにない」ということみたいですが 列名で捉えている時点でおかしい気がします select * from xTABLE where EMP_ID = null のSQLは正常にテーブルのSELECT結果が返ってきます。 どうすればよいでしょうか?

  • SQL文のエラー

    SQL文でエラーが表示されます。どの部分を修正すればいいですか? SQL文が長いので文字列を結合する演算子「.」を使って複数行に分けています。 エラー内容:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= ? and product_id = product.id' at line 2 //商品番号だけでなく、商品名や価格も表示したいので商品情報を保持するproductテーブルと 結合する。 //全て取得するのでSELECTは* //favoriteテーブルにはcustomer_idとproduct_id //productテーブルにはid, name, price $sql = 'SELECT * FROM favorite, product' . 'WHERE customer_id = ? and product_id = product.id '; // ?に顧客番号を指定する。 // favoriteテーブルの商品番号(product_id列)と、productテーブルの商品番号(id列)が // 一致している行だけが必要なので、WHERE句に条件を追加する。

  • SQLについて

    うまく説明できるるかわかりませんが、 以下、解決方法がもしあれば教えてください。 VBで Oracleデータベースを接続し、 SQL実行をするツールを作成しています。 概要は、二つのデータベースを接続しています。 一つには、職員番号と、所属コード 二つ目には、職員番号と、異動地コード 選択した、所属コードから職員番号を引っ張ると、10名が該当して、 その全員に選択した異動地コードをinsertするというものです。 問題なく、できたのですが、 10名のうち1人は、別途で異動地コードを入力しており、そのあとに完成したセレクト文を流すと、一意制約に引っかかります。 職員番号と異動地コード、さらにinsertする日付などがユニーク制約をかけているので、理由もわかるのですが、はじかれる1人以外の9名だけinsertすることは可能なのでしょうか? できるかどうかもわからず、困っています(;_;) なにかいい方法があれば、教えてください。

  • 要求を満たすことのできるSQL文を教えてください

    現在、売上の明細を明細IDごとにグループ化し合計値を表示させるプログラムを開発中です。 以下のような要件を満たすSQL文を教えてください。 【もともとの売上の明細のテーブル】 明細ID | NAME | KINGAKU 001  |商品A | 1000 001 |商品B | 500 001 |商品C | 300 002 |商品A | 1000 002 |商品D | 1500 【グループ化後のテーブル】 明細ID | NAME | KINGAKU 001 |商品A | 1800 002 |商品D | 2500 ・明細IDごとに金額を合計する。 ・NAMEの列については、その明細IDの中で最大の金額の商品名を入れる。 ※現在、明細IDごとに金額を合計するのはできているのですが、  もう1つの要件をどのようにすれば達成できるのか分からない  状況です。要件を満たすことのできるSQL文をぜひ教えてください。 よろしくお願いいたします。

  • 関数の変え方

    C列に顧客管理のID番号 D列に売上金額を設定しています。 =SUMPRODUCT(($C$2:C27="001")*($D$2:D27)) の関数をコピーしていきたいのですが  "001" が 002 003 004 005 と変わっていくにはどうすればいいですか。 ご指導いただければ幸いです。

  • 場合によって条件を変えるSQL

    ORACLE環境下、SQLにて以下のような条件でデータを取得したいです。 AテーブルとBテーブルを結合して、Bテーブルから名称を取得する。 <Aテーブル> id (key) 番号1 番号2 A01  001  n0001 A02  null  n0002 <Bテーブル> code(key) 名前  番号1 番号2 c0001   太郎  001  n0001 c0002   次郎  002  n0002 (1)A.番号が入力されていれば A.番号1=B.番号1 AND A.番号2=B.番号2を条件にする (2)A.番号が入力されていなければ A.番号=B.番号を条件からはずす。 A.番号2=B.番号2 のみで検索する。 <欲しい結果> A01→太郎を取得 A02→次郎を取得 入力されていたら条件に加え、入力されていなかったら 条件から外す、というSQLを教えていただけないでしょうか。 よろしくお願いいたします。

  • SQLの集計について教えてください。

    環境はoracle9iです。 ■テーブルの構成 |年度|月|部署コード|商品コード|金額| ■テーブルの内容 |2010|01|AAA|001|1000| |2010|02|AAA|001|2000| |2010|01|AAA|001|3000| |2010|01|AAA|002|3000| |2010|02|BBB|003|4000| |2010|01|CCC|001|5000| |2010|03|CCC|001|6000| 上記のようなテーブルがあり、 これを年度,月,部署コード,商品コードでサマリした値を表示したいです。 と、ここまでなら上の4つでGROUP BYしてあげれば良いのですが、 そこに年度,部署コード,商品コードでサマリした 「累計金額」列を加える必要があります。(イメージは下記のとおりです。) ■抽出結果の構成 |年度|月|部署コード|商品コード|金額|累計金額| ■抽出結果の内容 |2010|01|AAA|001|4000|6000| |2010|02|AAA|001|2000|6000| |2010|02|BBB|003|4000|4000| |2010|01|CCC|001|5000|11000| |2010|03|CCC|001|6000|11000| GROUP BYと別の集計単位で列を作ることが可能か、 可能であればどのようなSQLを書くべきか、 というところを教えてください。

  • Oracleストアドの互換性について

    Oracleのストアドについて質問です。 32bit版ではコンパイルが通るのに、64bit版ではコンパイルが通りません。 Ora-00918列定義が未確定がでます。 列名ではなく、列番号で指定するとコンパイルが通るようになります。 ただし、きちんと値をとってきていない。 ・Oracle10.2.0.3 x32(windowsServer2003x32)でOK。 ・Oracle10.2.0.5 x64(windowsServer2008x64)ではコンパイルエラーになります。(Ora-00918) 列定義が未確定がでます。 同じくOracle11.0.1x64(windowsServer2008x64)でも同じエラーが出ます。 文字コードはS-JISです。 Oracle10.2.0.5にアップのパッチを当てています。 64bitでなにかあるのでしょうか?