PL/SQLでの集計とテーブルの結合の仕方

このQ&Aのポイント
  • PL/SQLでの集計とテーブルの結合の仕方について、初心者が頭を悩ませています。テーブルの結合と集計の方法を知りたいとのことです。
  • 質問者はあるグループでレコードを集計し、そのグループが他のテーブルと結合したいと考えています。テストデータは1万件以上あるため、処理方法を教えてほしいと頼んでいます。
  • どなたかPL/SQLの結合と集計に詳しい方が助けてくれないでしょうか?初心者が行き詰まっており、テーブルの結合方法と集計方法がわかりません。お願いします。
回答を見る
  • ベストアンサー

PL/SQLでの集計とテーブルの結合の仕方

いつもお世話になっております。 pl/sqlでの処理なのですが、タイトルのとおり テーブルの結合と集計で分からないところがあり、 こちらで質問させていただきました。 処理内容は あるグループでレコードを集計し、 そのグループが重複する他のテーブルと結合したいと 考えております。 【テーブル1】 (班) (回数) (秒) aaa| 10| 100 aaa| 20| 200 bbb| 10| 150 bbb| 20| 100 ccc| 10| 100 ccc| 30| 250 : : : まずこれを集計し、件数を追加して (班) (回数) (秒) (件) aaa| 30| 300| 2 bbb| 30| 250| 2 ccc| 40| 350| 2 : : : : というようにまとめ、 【テーブル2】 (年月) (班) (円) 200904| aaa| 1000 200905| bbb| 1500 200904| ccc| 2000 : : : というテーブルと結合して (年月) (班) (回数) (秒) (円×件) 200904| aaa| 30| 300| 2000 200905| bbb| 30| 250| 3000 200904| ccc| 40| 350| 4000 : : : : : という形にしたいのですが可能でしょうか? 例に挙げたのは3件しかありませんが テストデータは1万件以上ありそれを処理します。 初心者なので、テーブルの結合の仕方、 集計の仕方が分からず行き詰っております。 どなたか、お力を貸していただけないでしょうか。 よろしくお願いいたします。

  • Oracle
  • 回答数1
  • ありがとう数1

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

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

select テーブル2.年月 "年月", テーブル2.班 "班", テーブル1集計結果.回数計 "回数", テーブル1集計結果.秒計 "秒", テーブル1集計結果.件 * テーブル2.円 "円×件" from (select 班,sum(回数) 回数計,sum(秒) 秒計,count(*) 件 from テーブル1 group by 班) テーブル1集計結果, テーブル2 where テーブル1集計結果.班=テーブル2.班 ;

tao0417
質問者

お礼

期待通り、最終的に欲しい答えが得られました!! ありがとうございました!!

関連するQ&A

  • PL/SQLでの、集計→結合→集計の仕方

    いつもお世話になってます。 以前こちらで質問をさせていただいたのですが、 http://soudan1.biglobe.ne.jp/qa5076670.html さらに分からないことが出てきたので、また質問させていただきます 【テーブル1】 (年月日) (班) (回数) (秒) (種類) 20090401|aaa| 10| 100 A 20090401|aaa| 20| 200 A 20090501|bbb| 10| 150 B 20090501|bbb| 20| 100 B 20090401|ccc| 10| 100 C 20090401|ccc| 30| 250 C 20090401|ddd| 15| 200 A : : : まずこれを集計し、件数を追加して (班) (回数) (秒) (件) (種類) aaa| 30| 300| 2 A bbb| 30| 250| 2 B ccc| 40| 350| 2 C ddd| 15| 200| 1 A : : : : というようにまとめ、 【テーブル2】 (年月) (班) (円) 200904| aaa| 1000 200905| bbb| 1500 200904| ccc| 2000 200904| ddd| 1200 : : : というテーブルと結合して (年月) (班) (回数) (秒) (円×件) (種類) 200904| aaa| 30| 300| 2000 A 200905| bbb| 30| 250| 3000 B 200904| ccc| 40| 350| 4000 C 200904| ddd| 15| 200| 1200 A : : : : : とするのが前回までで ここから更に種類で集計をして (年月) (回数) (秒) (円×件) (種類) 200904 | 45| 500| 3200| A 200905 | 30| 250| 3000| B 200904 | 40| 350| 4000| C としたいのですが、 SELECT テーブル2.年月, テーブル1集計.種類, sum(テーブル1集計.回数), sum(テーブル1集計.秒数), sum(テーブル1集計.件数 * テーブル2.円) FROM (SELECT 年月日, 班, 種類, sum(回数) 回数, sum(秒数) 秒数, count(*) 件数 FROM テーブル1 GROUP BY 班,種類,年月日) テーブル1集計,テーブル2 WHERE テーブル1集計.班=テーブル2.班 GROUP BY 種類,テーブル2.年月; としたところ、最終的に出力したいテーブルの集計結果の (回数) (秒) (円×件)が正しいものより多くなってしまいました。 長くなって申し分かりません。 どこが間違っているのか、わかる方いらっしゃいましたら 教えていただけないでしょうか??

  • 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を書くべきか、 というところを教えてください。

  • SQL文がわからない

    在庫テーブル・入庫テーブル・出庫テーブルがあります。 指定期間内の入庫テーブル・出庫テーブルの数量と在庫テーブルを結合させたいが、どうすればいいでしょうか? 2日ほど悩みましたがどうしても分かりませんでした。 よろしくお願いします <在庫テーブル> コード 個数 aaa   10 bbb   10 ccc   10 <入庫テーブル> コード 個数 日付 aaa   1  1/1 aaa   1  1/2 bbb   1  1/2 aaa   1  1/3 aaa   1  1/4 bbb   1  1/4 ccc   1  1/5 <出庫テーブル> コード 個数 日付 bbb   2  1/2 aaa   2  1/3 bbb   2  1/4 ccc   2  1/4 aaa   2  1/5 <結果(1/2~1/3)> コード 個数 入庫 出庫 aaa   10   2   2 bbb   10   1   4 ccc   10   0   2

    • ベストアンサー
    • MySQL
  • 集計されたテーブルの結合

    SUM、AVGなどで集計された(group byを使って)テーブルを、LEFT JOINで結合するにはどうしたらいいですか?

    • ベストアンサー
    • MySQL
  • MySQLで1つの項目に対しての集計

    1つの項目内にカンマ等で区切られたデータがあります。その数を下の2種類のように集計する事って可能でしょうか? 例) KEY  項目 ----------------- 1   AAA,BBB,CCC 2   AAA,CCC 3   CCC,DDD 1) ----------------- 1  3(件) 2  2(件) 3  2(件) 2) ----------------- AAA  2(回) BBB  1(回) CCC  3(回) DDD  1(回) よろしくお願いします。

  • SQLでできること

    SQLだけでできることと、できないことって、一言で言い表せるでしょうか? データベースからデータを取り出すとき、どこまでできて、どこからはphpなど他の言語で処理したらいいのか、とても気になるんです。 もしかして、何でもできるのかな? というのも、今やりたいと思っていることが、 (環境はMySQL+PHP使用で、ブラウザで表示させます) テーブル A(人物のリスト) id|name ------- 1 | aaa 2 | bbb 3 | ccc 4 | ddd テーブル B(人物と成績のリスト) name| point ------------- aaa | 10 bbb | 15 bbb | 10 aaa | 20 bbb | 25 ccc | 30 のようなテーブルがあったとき、 aaaのpointの合計 = 30 bbbのpointの合計 = 50 cccのpointの合計 = 30 dddのpointの合計 = 0 ← テーブルBに載ってない人もいる という人物全員の結果の集計をするには、どうすると最適でしょう? 私がすぐ思いつくのは、テーブルAのデータを配列に読み込んで、それを元に次はテーブルBから、人物別の行を取り出すSQL文を作って、pointを集計するという手順です。他に手段はあるでしょうか?

    • ベストアンサー
    • MySQL
  • テーブルの結合について

    テーブルの結合について悩んでおります。 一人の情報をテーブルを結合する事は、出来たのですが、 下記のように、ユーザー情報テーブルと そのペアの情報が別にあり、 テーブルを結合した情報を取得したいのですが、 どのようなSQL文を書けばよいでしょうか、 また、テーブル設計を変更した方がよいでしょうか、 よろしくお願いいたします。 user_table no name sex 1  AAA   man 2  BBB   woman pear_table user_no1 user_no2 1     2 結果 name1 sex1 name2 sex2 AAA   nam  BBB  woman

    • ベストアンサー
    • MySQL
  • 異なる二つのテーブルの結合について・・・

    お世話になっております。 ちょっとややこしい質問になります。 「1」 Aと言うテーブルのAAと言うカラムから、$AAAと言うレコードを抽出致しました。ここまでは出来ました。(ここでの抽出結果を$CCCと致します。) 「2」 「1」の抽出結果($CCC)を元に、Bと言うテーブルのBBと言うカラムから、BBBと言うレコードも抽出し結合したいと考えております。 一番の問題は、「1」で出た結果(CCC)を元に、抽出する事が出来ません。 「1」のソースのみ完成してます。 $rs=$DB->query("SELECT * FROM `A` WHERE AA = '$AAA' ↑の抽出結果=$CCCを元に↓ $rs=$DB->query("SELECT * FROM `B` WHERE BB = '$CCC' 結合させたいんです!! セクションしているので結合できないとバラバラになってしまいます。。。。 ご教示お願い致します! inner join を使うのは分かるのですが・・・進めません。(泣)

    • ベストアンサー
    • MySQL
  • エクセル集計

    下記の表でfujiに関し、到着時間が2月3日分で3件あるので、処理結果表に3件というように集計したが、時間の境目のところで集計値が正しくない。式を、どう直せばよいかわからない。 OFFSET機能も不理解。適性値の考えを教えて。 データ(datremo!シート)    B列: クラス    D列:名前     G列:到着時間 Zzz: kon: 2006/2/10 14:47 Zzz: kon: 2006/2/10 14:47 Bbb: miu: 2006/2/10 14:43 Bbb: miu: 2006/2/10 14:42 Aaa: kon: 2006/2/10 14:34 Aaa: kon: 2006/2/10 13:25 Ccc:    tan: 2006/2/9 16:24 Ccc: tan: 2006/2/9 15:18 Ccc: tan: 2006/2/9 15:00 Aaa: fuji: 2006/2/3 17:45 Aaa: fuji: 2006/2/3 17:30 Aaa: fuji: 2006/2/3 16:14 ccc:     tan: 2006/2/1 13:40 処理結果::*の場所、c6の式=SUMPRODUCT((INT(OFFSET(datremo!$G$2,,,100,1))=$A6)*(OFFSET(datremo!$B$3,,,100,1)=C$3)*(OFFSET(datremo!$D$3,,,100,1)=C$4)) (datremo!$G$2:到着時間、$A6:集計表日付け 、datremo!$B$3:集計表のクラス、  datremo!$D$3:データの名前、C$4:集計表の名前) A列      C列 クラス Aaa: Bbb: ccc: 名前 fuji: miu: tan: 数 数 数 2006/2/1 水 0*: 0: 0: 2006/2/2 木 0: 0: 0: 2006/2/3 金 2: 0: 1: 2006/2/4 土 0: 0: 0: 2006/2/5 日 0: 0: 0: 2006/2/6 月 0: 0: 0: 2006/2/7 火 0: 0: 0: 2006/2/8 水 0: 0: 0: 2006/2/9 木 1: 0: 2: 2006/2/10金 0: 2: 1: 2006/2/11土 0: 0: 0: 略 2006/2/28火 0: 0: 0: トータル 3件 2件 4件

  • 分岐SQLを一発のSQLで実現したい

    【データベース:SQLServer2005】 SQLのアドバイスを頂きたいです。 【テーブル】 テーブル名:Table1 フィールド名:種類、キー1、キー2 テーブル名:Table2 フィールド名:種類、キー1、キー2 テーブル名:Table3 フィールド名:種類、キー1、キー2 【データ】 Table1 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD Table2 種類、キー1、キー2 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD Table3 種類、キー1、キー2 NULL  AAA  BBB NULL  AAA  CCC NULL  AAA  DDD これをUNIONで取得します。 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD NULL  AAA  BBB NULL  AAA  CCC 実現したいのは、 1)同種類、キー1、キー2のデータで、 種類にNULLが含まれていたら、NULLのデータは取得しない 2)同種類、キー1、キー2のデータで、 種類にNULLしかないデータは、取得する 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD →いる NULL  AAA  BBB →いらない NULL  AAA  CCC →いらない ↓結果 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD 上記を実現する為、UNION後のSQLでも構わないので、 一発のSQLで取得する事は可能でしょうか? 有識者の方にご享受頂ければ幸いです。 どうぞ宜しくお願い申し上げます。