• 締切済み

困っています。ORACLE_SQL 複数の文字列から共通部分を抜き出す方法

只今、SQL文を作成していますが、方法が分からず困っております。 どなたかスキルのある方で、解決方法を教えて頂けないでしょうか? 商品名と親コードというカラムがあり、 以下のような文字列があります。 商品名       親コード ----------------------------- 商品名のサンプルA  123456  商品名のサンプルB  123456 商品名のサンプルC  123456 ◆商品名のサンプルD 123456 商品名D       789012 商品名E       789012 この中から、親コードで集計して、左側前方から 「商品名の共通部分」だけを抜き出したいのですが、 どのようにSQL文を書けばよいでしょうか? 親コード123456の中で、一つだけ例外で◆から始まる 商品名がありますが、それは無視します。 取り出したい結果の例 商品名のサンプル  123456 商品名       789012 何卒、宜しくお願いします。

みんなの回答

回答No.2

分析関数で無理矢理に・・ select distinct * from ( select コード, replace(translate(商品名,translate(商品名,lead(商品名) over(partition by コード order by length(商品名)),' '),' '),' ','') 共通商品名 from T ) where 共通商品名 is not null;

2337
質問者

お礼

ご回答誠にありがとうございます。 検証してみます。

全文を見る
すると、全ての回答が全文表示されます。
noname#87380
noname#87380
回答No.1

こんにちは。私にスキルがあるかは不明ですが(笑 正規表現で不要な部分を空白置換してやって、集計後の結果に 結合してやれば出来そうな気がします。 10g限定ですが、参考になれば。 ■Sample ---------------------------------------------------------------------- CREATE TABLE T_TEST ( SYOHIN_MEI VARCHAR2(100) ,CODE NUMBER ); INSERT INTO T_TEST VALUES('商品名のサンプルA' ,'123456'); INSERT INTO T_TEST VALUES('商品名のサンプルB' ,'123456'); INSERT INTO T_TEST VALUES('商品名のサンプルC' ,'123456'); INSERT INTO T_TEST VALUES('◆商品名のサンプルD' ,'123456'); INSERT INTO T_TEST VALUES('商品名D','789012'); INSERT INTO T_TEST VALUES('商品名E','789012'); COMMIT; SELECT * FROM (SELECT CODE ,REGEXP_REPLACE(SYOHIN_MEI,'[A-Z]*$','') COMMON_STR FROM T_TEST WHERE SYOHIN_MEI NOT LIKE '◆%' ) GROUP BY CODE ,COMMON_STR ; ----------------------------------------------------------------------

2337
質問者

お礼

ご回答誠にありがとうございます。 品番のところは、実際にはいろいろな文字が入っています。この方法では解決できませんでした・・・。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQLでの集計方法について

    SQLでの集計方法がわからず質問をさせていただきます。 改版のたびに商品名を変える商品がたくさんあるとします。 (下記のような感じで、履歴番号が大きいほど新しい) 商品コード 履歴番号 商品名 123456    8    元祖○○ 123456    7    ○○外伝ターボ 123456    6    ○○外伝 123456    5    スーパー○○2 123456    4    スーパー○○ 123456    3    ○○3 123456    2    ○○2 123456    1    ○○ この場合に、各商品コードの履歴番号が最大(最新)の、 「商品コード」「改版履歴番号」「商品名」を取得するには どのようなSQLを作成すればいいでしょうか?

  • SQLで後方の文字列を置換する方法

    表現方法が稚拙で申しわけありませんが。 あるテーブルに存在する値を、他のテーブルにある値と前方一致で結合したいと思います。 (1)TBL_A(項目名はA) (a) 10230 (b) 11350 (c) 30040 (2)TBL_B(項目名はB) (d) 10200 (e) 11000 (f) 30000 (形式はVARCHAR2,値は数字のみで長さは固定) 上記のようなデータで、TBL_Bに関しては後ろの「0」は無視して 前方一致で結合したいのです。 つまり、(a)と(d)、(b)と(e)、(c)と(f)が結合されるようにしたいのです。 SQL文で表現すると、次のようになります。 TBL_A.A LIKE '102%' OR TBL_A.A LIKE '11%' OR TBL_A.A LIKE '3%' これを次のようなSQLで記述してみました。 TBL_A.A LIKE SUBSTR(TBL_B.B,1,INSTR(TRANSLATE(TBL_B.B,'123456789','XXXXXXXX'),'X',-1,1)) || '%' 以上のSQLで問題ないと思いますが、もっとシンプルな方法があればお教え願います。 DBはORACLE9iです。

  • SQL (ORACLE)について

    こんにちは。 SQL文について教えてください。 【temp1テーブル】 code name value 001 yama 100 002 kawa 200 003 umi 300 【temp2テーブル】 code name value 002 kawa 200 004 minato 500 上記の2つのテーブルtemp1とtemp2を比較して codeの値とnameの値が同じレコードの場合 temp1のvalue値を temp1のvalue + temp2のvalueにする 方法を教えて頂けませんでしょうか。

  • SQLで複数列のデータを複数行にしたい

    以下のようなテーブルがあるとします。 column1 a,b,c <- カンマの数は最大50 b,d c,x SQLを実行し以下のような結果を返したいです。 以下の3つのことをすればできそうなのですが複数列を複数行にする方法がわかりません。 1.strtokenで50カラムに分割(カンマ分割) 2. 50カラムを1カラムにする 3.DISTINCTで重複データの削除 結果 a b c d x カンマの数が50あるので、かなり長いSQLになるのですが SELECT文50個をUNIONしてやればできるかなとも考えているのですが 何か良い方法はないでしょうか。 よろしくお願いします。

  • 複数のカラムの中から最大値を取得するSQL

    MySQLで1コードの中で3つのカラムから最大値を 取得する事は可能でしょうか? id test1,test2,test3 1 5 7 6 だとすると、id=1の最大値は7と返してくれるSQL を書きたいです。IF文とか使わないと無理でしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • ☆☆☆☆SQL Olacle 3つ以上の文字列を連結をスマートにする方法 ご教授下さい☆☆☆☆

    ご存知のかたご教授下さい。 select文で 3つ以上の文字列を連結して抽出したいのですが 適切な関数 方法がわかりません。初歩的質問ですみませんが困ってますのでご教授ください。 私の浅い知識だと 下記のようなconcat 関数を連続で記載する方法しかわかりませんでした。 select concat((concat (column1 ,column2)),column3) from sample_tbl;

  • SQL文で質問

    SQL文で質問 いつもお世話になっております。 SQL文について質問です。 仮にですが、商品マスタというテーブルと、対応テーブルという二つのテーブルがあります。 対応テーブルには、商品コードが親コード、子コードといった形で構成されています。 対応テーブルのいくつかの親のコードを条件に、親コードと子コードを検索して、それぞれの商品名を検索したいと思っています。 現在、SQL文で、親コードに対応した商品名だけを取得しているのですが、子コードに対応する商品名も検索したいと思っています。 現在のSQL分としては、 SELECT 対応テーブル.親コード、商品マスタ.商品名、対応テーブル.子コード FROM 対応テーブル,商品マスタ WHERE 対応テーブル.親コード = 商品マスタ.商品コード AND 対応テーブル.親コード = 1000,1002,1004 このSQL文で検索した子コードで、商品マスタの商品名を検索したいのですが、どのようなSQLを書いたらよいのでしょうか。 ご教授願います。

  • 複数の行を集約するSQLについて

    以下のテーブルのレコードをもとに A B C 1| あ | あ | 1 | 2| あ | い | 1 | 3| あ | う | 1 | 4| う | あ | 1 | 5| え | あ | 1 | 6| あ | あ | 2 | 7| あ | い | 2 | 8| あ | う | 2 | 9| う | あ | 2 | 以下のテーブルを作成したいと考えています。 A B C D E 1| あ | あ | 1 | あ | - | 2| あ | い | 1 | い | - | 3| あ | う | 1 | う | あ | 4| え | あ | 1 | - | え | 5| あ | あ | 2 | あ | - | 6| あ | い | 2 | い | - | 7| あ | う | 2 | う | あ | (1)カラムCを1つのグループとします。 (2)その中でカラムAの値が「あ」の場合は、カラムBの値をカラムDに設定する。 (3)カラムAの値が「あ」ではない場合は、カラムBの値をカラムEに設定する。 (4)カラムAの値とカラムBの値を入替えると同じ場合は(例では上の表の3と4、8と9のレコード)、 カラムAの値が「あ」でない方のレコード(4と9のレコード)のカラムBの値をカラムEに設定する。 (5)(4)で値を設定した方のレコードを削除する。 どのようなSQLを作成すればできるのでしょうか? SQLに詳しい方がいらっしゃれば、ご教授をお願います

  • SQLでの複数検索条件の書き方を教えて下さい。

    SQLを使うことが初めての、本当にど素人です。 質問の仕方自体おかしいかもしれませんが、どなたか下記条件でデータ抽出するSQLの書き方を教えて下さい。 【抽出条件】 1つの商品購入テーブルから、5月と6月に購入してて、7月と8月に購入していない、東京都と神奈川県在住の方の顧客IDと購入商品すべてを抽出できないでしょうか? カラムは、顧客ID、購入月、顧客都道府県、商品コードとそれぞれ分かれています。 この内容で、ご回答いただけますでしょうか? 何卒よろしくお願いします。

  • 動的にSQLを作成し、値を取得する方法について

    Pro*Cでテーブル名を動的に与え、カラムの1つであるシーケンス番号の最大値を取得しようとしています。 ネットで調べたところ、 EXEC SQL DECLARE S1 STATEMENT; sprintf(buf1, "実行するSQL文", ); EXEC SQL PREPARE S1 FROM :buf1; EXEC SQL EXECUTE S1 INTO :取得結果格納領域; という構文で出来るということがわかったのですが、最後のところで、取得結果格納領域に値が入りません(正確には初期値「0」が入ります)。 取得したいデータを直接SQL*PLUSで実行すると0ではない値となるのですが、どのようにすれば値が取得できるかをご教授いただければと思います。 実行するSQL文の中には「%s」を含んでおり、sprintfの第3引数でテーブル名を渡しているので、buf1の中身はそのままSQL*PLUSで実行できる内容となっています。 それぞれのEXEC SQLの後にSQL終了コード(sqlca.sqlcode)を取得しましたが、どれも0(正常終了)で終わっていました。 どうかご教授のほど、よろしくお願いします。

このQ&Aのポイント
  • パソコンの用紙設定でA4を指定しても、注意のマークがつく
  • 「プリンター本体に用紙をセットしたときの設定で印刷する場合」という意味がわからない
  • EPSON社製品での問題、再インストールしても改善されない
回答を見る