質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

5回答

3412閲覧

【SQL】サブクエリにて抽出した複数条件による集計

TomoyaHirayama

総合スコア7

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/08/24 01:10

編集2016/08/24 02:55

###前提・実現したいこと
Oracle 11gの環境にてSQLについての質問です
サブクエリにて抽出した検索キーを使い
それぞれのキーで集計を行いたいと考えています。

下記以外の方法はありますか?

###発生している問題・エラーメッセージ
サブクエリにて帰ってくる値が複数件になるため
where句に直接指定することができません。

###該当のソースコード

SELECT SUM(COST) FROM T1 WHERE CODE LIKE ( SELECT REGEXP_REPLACE(CODE,'9.*'.'%') FROM T2 WHERE CODE LIKE '%9' )

TABLE

T1
CODE COST
11111100 10
11111200 20
11111300 30
11111410 40
11111420 50
11111510 60
11111520 70
11111600 80
11111700 90
11111800 100

T2
CODE
11111100
11111200
11111300
11111410
11111420
11111499
11111510
11111520
11111599
11111600
11111700
11111800
11111999

サブクエリの結果
KEY
111114%
111115%
11111%

###取得したいデータ
90
130
550

###試したこと
CASE式を使用しようと考えましたが
集計キーが動的に変化するため有効でないと判断しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2016/08/24 01:24

少し具体的な例を出してもらえると回答がされやすいと思います。
guest

回答5

0

ベストアンサー

JOIN句でLIKE自体の指定は出来た気がする。

SQL

1SELECT 2 T1.* 3FROM 4 T1 5 INNER JOIN ( 6 SELECT 7 REGEXP_REPLACE(CODE, '9.*'.'%') AS SEARCH_KEY 8 FROM 9 T2 10 WHERE 11 CODE LIKE '%9' 12 ) TMP 13 ON T1.CODE LIKE TMP.SEARCH_KEY

でもこれだけでは集約はうまくいかないはずなので、
以下のような感じで集約キー自体は疑似的に作成したら何とかなるかもしれません。
※現在手元に実行環境がないので、ミスってて動作しなかったらすみません^^;

SQL

1SELECT 2 MAX(TMP.SEARCH_KEY) AS SEARCH_KEY 3, SUM(T1.COST) AS TOTAL_COST 4FROM 5 T1 6 INNER JOIN ( 7 SELECT 8 REGEXP_REPLACE(CODE, '9.*'.'%') AS SEARCH_KEY 9 , ROW_NUMBER() OVER (ORDER BY CODE) AS GRP_ID 10 FROM 11 T2 12 WHERE 13 CODE LIKE '%9' 14 ) TMP 15 ON T1.CODE LIKE TMP.SEARCH_KEY 16GROUP BY 17 TMP.GRP_ID

上記よりも下の方が安全そうな気がするので更に投下してみる

SQL

1SELECT 2 MAX(TMP.SEARCH_KEY) AS SEARCH_KEY 3, SUM(T1.COST) AS TOTAL_COST 4FROM 5 T1 6 INNER JOIN ( 7 SELECT 8 T.SEARCH_KEY 9 , ROW_NUMBER() OVER (ORDER BY T.SEARCH_KEY) AS GRP_ID 10 FROM 11 ( 12 SELECT 13 DISTINCT REGEXP_REPLACE(CODE, '9.*'.'%') AS SEARCH_KEY 14 FROM 15 T2 16 WHERE 17 CODE LIKE '%9' 18 ) T 19 ) TMP 20 ON T1.CODE LIKE TMP.SEARCH_KEY 21GROUP BY 22 TMP.GRP_ID

投稿2016/08/24 13:09

編集2016/08/24 13:28
Panzer_vor

総合スコア1636

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TomoyaHirayama

2016/08/25 01:00

回答ありがとうございます。 参考になりました。動作検証します。
guest

0

ごめんなさいOracleの環境がないので一般的な話になりますが
別のやり方という意味では

T2から取り出すデータを
^111114
^111115
^11111
としてREGEXPでリレーションするという考え方もあります
もちろん、こちらのほうが効率がわるいですが、
もうすこし複雑な条件が与えられるので状況にあわせて検討ください

いずれにしろ
90
130
550
だけ抽出したのでは集計単位がわからないですよね
WHERE句でサブクエリをリレーションするのではなく
FROM句で併記するかJOINするかしてサブクエリのCODEを利用した
GROUP BY をしたほうが良いと思いますが・・・

投稿2016/08/24 04:37

yambejp

総合スコア114968

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TomoyaHirayama

2016/08/25 01:01

回答ありがとうございます。 参考になりました。
guest

0

たんなる思いつきですが、こんな感じにしたら視点変わりますかね。

sql

1SELECT 2 SUM(COST) 3FROM 4 T1, ( 5 SELECT 6 REGEXP_REPLACE(CODE,'9.*'.'%') 7 FROM 8 T2 9 WHERE 10 CODE LIKE '%9' 11 ) AS CODE_TABLE 12WHERE 13 CODE LIKE (CODE_TABLEをつかった条件?) 14

投稿2016/08/24 02:58

kodai

総合スコア759

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SQLだけだと厳しいかなあ。
たぶんアプリケーション側でT2を元にSQL作ってT1を集計
って形が素直な発想だと思います。
それがだめならストアドプロシージャを使って
T2をループしながらT1の合計を求める形か。

ちなみに、三つ目のKEYは他の二つを包含しているようですが、
そういうパターンもあるってことですかね?

投稿2016/08/24 02:37

takasima20

総合スコア7460

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TomoyaHirayama

2016/08/24 02:48

回答ありがとうございます >ちなみに、三つ目のKEYは他の二つを包含しているようですが、 そういうパターンもあるってことですかね? T2.CODEの末尾9のもので集計したいと考えているので 内包するパターンも出てきます。
guest

0

likeではなくinを使えばいいのでは?

投稿2016/08/24 01:27

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TomoyaHirayama

2016/08/24 01:59

回答ありがとうございます 言葉足らずでしたが、サブクエリにて抽出した検索キーは 前方一致にて集計したいと考えておりますので 今回はLIKEにて条件を指定致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問