• 締切済み

SQL、特にOralce 8iに関して、データの集計に関する質問です。

SQL、特にOralce 8iに関して、データの集計に関する質問です。 以下のようなデータがあったとします。 [開始年月(int)]  [終了年月(int)]  [値] 201001      201004      1 201003      201007      2 201005      201010      3 201007      201101      4 このとき以下のような感じで、重複している月で値を合算し、一番値が大きな月を求めるには、どうすればよいでしょうか。 1 2 3 4 5 6 7 8 9 101112 (月) ■■■■________ __■■■■■_____ ____■■■■■■__ ______■■■■■■ ↓↓↓↓↓↓↓↓↓↓↓↓ 1 1 3 3 5 5 9 7 7 7 4 4 (計) ←この場合 7月が一番大きかった できればPL/SQLなしで解決したいと思っております。 ご教示お願いいたします。

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

みんなの回答

回答No.2

WHERE句の右側に+1するのを忘れてました・・・。

回答No.1

こんにちは。 今手元にOracleがないので検証ができません。 日付変換など、細かいところは調整してください・・・。 ※このままだと確実にエラーです。 SELECT 値, ADD_MONTHS(TO_DATE(開始年月), COUNTER-1) AS 日付 FROM (SELECT 値, 開始年月, 終了年月 FROM テーブル) A, (SELECT ROWNUM AS COUNTER FROM ALL_CATALOG) B WHERE B.COUNTER <= 終了年月-開始年月 ORDER BY 値, 日付; ここまででFROM、TOしかなかった日付範囲を分解しています。 途中、インラインビューでALL_CATALOGを使用していますが、連番さえ取れれば問題ないので、例えば、1~1000ぐらいまで連番を持っているテーブルでも構いません。 (その場合はROWNUMじゃなくてカラム名になりますが・・・) 後はカウント取れば、最大出現頻度の日付(年月)が取得できます。

関連するQ&A

  • PL/SQLの戻り値について

    現在正規化されていないテーブルを、PL/SQLを使って集計したいと考えています。以下のような構造にしたいと思うのですが、可能でしょうか? 1.正規化されていないテーブルのデータを正規化されたテーブル(テンポラリーテーブル)へ転記 2.テンポラリーテーブルテーブルのデータを集計(GROUP BYなどで) 3.2の結果を戻す 上記1~3までをすべてPL/SQLで実行し、その結果を取得したいです。 なお取得する結果としては、  キー,集計値1,集計値2    ・    ・    ・ というような構造で、複数レコードあります。 つまり、通常のSELECT文で返ってくる値を、PL/SQLで戻したいと考えています。

  • エクセル データ集計について

    エクセルのデータ集計についてご教示下さい。 (1)まず、以下のような項目があるとします。 (重複は無し) りんご みかん ぶどう (2)次に以下のようなデータがあるとします。 (重複あり。順番はランダム) ぶどう みかん ぶどう そして(1)と(2)から以下のような集計結果にするにはどのような関数を使うと良いでしょうか? (|はセルの区切りと思って下さい) りんご | 0 みかん | 1 ぶどう | 2 以上よろしくお願いします。

  • SQLの時間データを15分単位で集計できますか?

    SQLで質問させてください。 現在、datetime型の項目があるのですが、これを15分単位で集計したいのです。具体的には以下のようなテーブルとなっています。 時間        値 ―――――――――――――――― 2009/1/1 15:02:00 1 2009/1/1 15:04:00 1 2009/1/1 15:16:00 1 2009/1/1 15:31:00 1 2009/1/1 15:48:00 1 2009/1/1 16:04:00 1 これを次のような形に集計できないものでしょうか? 年月   時間    数 ―――――――――――――――― 2009/1/1 15:00   2 2009/1/1 15:15 1 2009/1/1 15:30 1 2009/1/1 15:45 1 2009/1/1 16:00 1 何かアイデアがございましたら、よろしくお願いします。

  • 集計のSQL文について

    SQLでの集計方法について質問です。 Oracle8iを使用しています。 あるテーブルに以下のようなレコードがあります。 ID 回数 値 1   1  100 1   2  200 1   3  300 2   1  150 2   2  550 .... この登録されている値をそのIDごとに、その回数まで回数ごとにサマリーした結果を出力したいのですが どうすればよいでしょうか。 ID 回数 値 1   1  100  ・・・(100) 1   2  300  ・・・(100+200) 1   3  600  ・・・(100+200+300) 2   1  150  ・・・(150) 2   2  700  ・・・(150+550) 宜しくお願いします

  • 集計を行うSQLについて

    以下の2テーブルの構成で、from_uid毎のto_uidへの在庫移動個数(val)を集計したいと考えています。 ユーザテーブル(user):uid(int), name(string) 在庫移動管理テーブル(zaiko):id(int), from_uid(int), to_uid(int), val(int) たとえば、それぞれ以下のようなレコードがあった場合、 <user> uid, name 1 aaa 2 bbb 3 ccc <zaiko> id, from_uid, to_uid, val 1 1 2 3 2 1 2 5 3 2 1 1 4 3 1 4 結果として、以下を得たいと考えています。 uid=1で検索した場合 to_uid, val 1 0 2 7 3 -4 uid=2で検索した場合 1 -7 2 0 3 0 uid=3で検索した場合 1 4 2 0 3 0 (イメージとしては、対戦表?の以下のような表を一行ずつ取得する様な感じです。) ___1__2__3 1__0__7_-4 2_-7__0__0 3__4__0__0 上記のような結果を得たい場合、どのようなSQLを書けばよいのでしょうか。 内容について、わかりづらい点等がありましたらご指摘ください。

  • 重複データを省いて集計する方法について

    お世話になります。 現在、重複データを省いて集計する方法を考えているのですが、実現できておりません。 実現できるSQLをご存知の方、いらっしゃいましたら情報を頂けますでしょうか。 # 私の使用しているのは、PostgreSQL8.3となります。 実現したい内容は、以下となります。  ・テーブルAからID単位で人数を集計。 ※但しファイル名が同じ場合は、1つとして集計する。   group by句でID,ファイルをグループ化してみたのですが、うまくいきません。    【テーブルA】    ID  ファイル  人数    0001 aaa.txt  3    0001 aaa.txt  3    0001 aaa.txt  3    0001 bbb.txt  3    0001 bbb.txt  3    0001 bbb.txt  3    0000 ccc.txt  3    0000 ccc.txt  3    0000 ccc.txt  3 欲しい結果は、以下となります。     ID  集計    0000 3    0001 6 お手数お掛け致しますが、ご教示のほどよろしくお願い致します。

  • 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万件以上ありそれを処理します。 初心者なので、テーブルの結合の仕方、 集計の仕方が分からず行き詰っております。 どなたか、お力を貸していただけないでしょうか。 よろしくお願いいたします。

  • 集計するためのSQL構文を教えて下さい。

    初めて投稿します。よろしくお願いします。 現在、ストアドプロシージャとSQLの勉強をしながら作業を行なっています。そのため説明不足などありましたらご指摘願います。 [環境]  データベース:SQLServer2005  SQL作成環境 :SQLServerManagementStudioExpress(9.00.2047.00) 望んでいる出力結果 病室,タイプ,10/01水,10/02木,10/03金,10/04土,10/05日 -------------------------------------------------------------- 10,集合3,○○太郎,○○太郎,○○太郎,○○太郎,□□花子        △△太郎,△△太郎,□□花子,□□花子        □□花子,□□花子 11,個室A,          ××太郎,××太郎,××太郎 12,個室B,     ○○次郎,○○次郎,○○次郎,○○次郎 ※指定した日付範囲で、全病室を対象に入院中患者、入院予定患者を  病室単位で求めたいです。 関係するテーブル情報 ※マスタテーブルは、名称+Mで表記します。 ※データテーブルは、名称+Tで表記します。 [病室] 病室M(  病室番号 INT  タイプコード INT ) [日付] ストアドのパラメータで集計開始日と終了日を受け取るため、 その集計範囲も動的に変わります。 ※上記の結果では、  集計日(自):2008/10/01  集計日(至):2008/10/05 を受け取った場合を想定し記述しています。 [入院者氏名] 患者T(  患者コード INT  患者氏名 VARCHAR(128)  通院種別 TINYINT(1:通院,2:入院)  退院区分 TINYINT(1:入院,2:退院)  入院日 SMALLDATETIME  退院日 SMALLDATETIME ) [患者と病室を紐付けるテーブル] 病室割当T(  割当番号 INT  患者番号 INT  病室番号 INT ) 長文となり申し訳ありません。 上記の情報でストアドを組もうとしているのですが、 SQL含め勉強不足な状態です。 実現するための考え方、方法、アドバイス等を頂きたいです。 よろしくお願い致します。

  • SQL文(PL・SQL)

    給料表として属性が社員ID、給料適用開始年度、給料適用開始月、給料があります。例えば、 1行目→101、2008、8、200,000 2行目→101、2008、10、210,000 3行目→102、2007、12、190,000 というデータがあった場合に2008年の9月の社員全体の給料合計を求めたいんです。この場合社員101の人は9月時点の給料は200,000で102の人は190,000のままです。このような場合どうSQL or PL/SQLを書けばこの情報を得ることできますか?

  • EXCEL:重複データを集計したい!

    ALPHA ALPHA ALPHA BRAVO BRAVO DELTA TANGO TANGO 上記のように縦に並んだ重複データを 以下のように集計する方法はないでしょうか。 ALPHA 3 BRAVO 2 DELTA 1 TANGO 2 WEB検索したところ、重複データ消去or抽出という 関数、マクロはあったのですが、 集計に至るまでのTIPSはありませんでした。 よろしくお願い致します。