- ベストアンサー
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
- mictoc
- お礼率42% (3/7)
- Oracle
- 回答数3
- ありがとう数2
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
誰かもっとすっきりしたものを考えてくれ 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)
#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)
「番号」は主キーでしょうか? 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 は、手元の辞典にも載っていないし、ネットで検索しても解説しているところがありません。このようなときは、プログラムで参照すべき他のモジュールが足りないと考えた方が良いのでしょうか。 ときどき調べがつかない関数があるので困ってしまうので、そのような時はどうすべきか教授願いたいです。(^^;
- 締切済み
- SQL Server
- 列名の取得方法は?
VB6.0 ORACLE10g Win20003Server WinXP開発 よろしくお願いします。 列名(フィールド名称)を取得する方法(SQL)がありましたら、お願いします。 データの内容はわかるんですが、列名(どの列に入っているのか)を知りたいと思っています。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- 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句に条件を追加する。
- 締切済み
- MySQL
- SQLについて
うまく説明できるるかわかりませんが、 以下、解決方法がもしあれば教えてください。 VBで Oracleデータベースを接続し、 SQL実行をするツールを作成しています。 概要は、二つのデータベースを接続しています。 一つには、職員番号と、所属コード 二つ目には、職員番号と、異動地コード 選択した、所属コードから職員番号を引っ張ると、10名が該当して、 その全員に選択した異動地コードをinsertするというものです。 問題なく、できたのですが、 10名のうち1人は、別途で異動地コードを入力しており、そのあとに完成したセレクト文を流すと、一意制約に引っかかります。 職員番号と異動地コード、さらにinsertする日付などがユニーク制約をかけているので、理由もわかるのですが、はじかれる1人以外の9名だけinsertすることは可能なのでしょうか? できるかどうかもわからず、困っています(;_;) なにかいい方法があれば、教えてください。
- 締切済み
- Oracle
- 要求を満たすことのできる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文をぜひ教えてください。 よろしくお願いいたします。
- ベストアンサー
- SQL Server
- 場合によって条件を変える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を教えていただけないでしょうか。 よろしくお願いいたします。
- 締切済み
- Oracle
- 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ストアドの互換性について
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でなにかあるのでしょうか?
- ベストアンサー
- Oracle