• 締切済み

オラクルの文法をMySQLにて記述したい

私の質問内容を見て頂きありがとうございます。 もう1件の質問内容のある程度のところまで詰めることができたのですが 1点困っていることがあり、またネット上でも理解できる内容が見つからなかったためこちらに質問させて頂きます。 オラクルにて --元テーブル CREATE TABLE T_TEST_4 ( KEY VARCHAR2(8), NAME VARCHAR2(255) ) --元テーブルのデータ KEY NAME ------------------------------ 1 AA,AAA,BBB,BBBB,ZZZZZ 2 CCC,DDD,EE,FFFF --SQL /* SplitSQL */ select col1, col2 from( select col1, col2, row_number() over (partition by col1 order by col2 desc) rnk from( select substr( name, case rn when 1 then 1 else instr(name, delm, 1, rn - 1) + 1 end ,case rn when 1 then case instr(name, delm, 1, rn) when 0 then length(name) else instr(name, delm,1,rn)-1 end when nvl(length(translate(name, delm || name, delm)), 0) + 1 then length(name) else instr(name,delm,1,rn)-1-instr(name,delm,1,rn-1) end ) col1, key col2 from T_TEST_4, (select ',' delm from dual) b, (select rownum rn from all_catalog) c where rn <= nvl(length(translate(name,delm || name, delm)),0) + 1 ) ) where rnk = 1 order by col1; --SQL実行結果 COL1  COL2 ------------- AA 1 AAA 1 BBB 1 BBBB 1 CCC 2 DDD 2 EE 2 FFFF 2 ZZZZZ 1 上記の場合 row_number() over (partition by col1 order by col2 desc) rnk の行はMySQLでどのように記述したら良いのでしょうか? 皆様お忙しい中、もし知っている方がいらっしゃいましたらご回答を宜しくお願い致します。

  • MySQL
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

ながっ! 全部見てないし、動作確認してないけど・・・、 部分的には相関サブクエリを使うしかありません。 row_number() over (partition by col1 order by col2 desc) rnk ↓ (select count(*) from T_TEST_4 t2 where t2.col1 = t1.col1 and t2.col2 >= t1.col2) as rnk ※元のテーブルのエイリアスをt1としてます・・・

関連するQ&A

  • MySQLの構文のエラーについて

    私の質問を見て頂きましてありがとうございます。 以下のような取得結果のSQLを作りたいのですが、構文エラーが出ており困っております。 エイリアスをつけなくてはならない?ようだったので全ての副問い合わせにエイリアスを付けてみたりしたのですが、エラーがとれませんでした。 --元テーブルのデータ key name ------------------------------ 1 AA,AAA,BBB,BBBB,ZZZZZ 2 CCC,DDD,EE,FFFF --期待するSQL実行結果 COL1  COL2 ------------- AA 1 AAA 1 BBB 1 BBBB 1 CCC 2 DDD 2 EE 2 FFFF 2 ZZZZZ 1 SELECT col1, col2 FROM( SELECT col1, col2, (SELECT @i:=@i+1 FROM (select @i:=0)) AS rnk FROM( SELECT SUBSTR( name, CASE rn WHEN 1 then 1 ELSE INSTR(name, delm, 1, rn - 1) + 1 end ,CASE rn WHEN 1 THEN CASE INSTR(name, delm, 1, rn) WHEN 0 THEN LENGTH(name) ELSE INSTR(name, delm,1,rn)-1 end WHEN IFNULL(LENGTH(translate(name, delm || name, delm)), 0) + 1 then LENGTH(name) ELSE INSTR(name,delm,1,rn)-1-instr(name,delm,1,rn-1) end ) AS col1, key AS col2 FROM T_TEST_4, (SELECT ',' AS delm FROM dual) AS b, (SELECT rownum AS rn FROM all_catalog) AS c WHERE rn <= IFNULL(LENGTH(REPLACE(name,delm || name, delm)),0) + 1 ) ) WHERE rnk = 1 ORDER BY col1; 以上、回答をご存じの方、ご回答を宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • オーダーNo.毎に集計するSQL

    オーダーNo.毎に集計するSQLを考えているのですが、少しSELECT文法で行き詰まってしまったので教えてください。 オーダーNo.毎にグループ化して、コード別の件数を集計します。 そして、コードが「10」のものが1件でもあれば表示する、というようなことを考えています。 SELECT ORDERNO, SUM(CASE WHEN CODE = 0 THEN 1 ELSE 0 END) AS CODE0, SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) AS CODE10, SUM(CASE WHEN CODE > 0 THEN 1 ELSE 0 END) AS CODEALL FROM DBORDER WHERE SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) > 0 GROUP BY ORDERNO ORDER BY ORDERNO このようにすると、WHEREのところで構文エラーになります。 ここをどのように変えれば意図どおりの動きをするようになるのか知りたいです。 よろしくお願いします。

  • 動的に生成したカラムを使ったFUNCTION

    レコード型の使用方法がわからないので、悪戦苦闘しております。。。 【やりたいこと】 ・あるテーブルのある項目でGROUP BYし、別の項目事に集計した結果を  カラムとして出力 クロス集計と呼ぶのでしょうか? 上記の結果表を取得出来るFUNCTIONを作成したいのです。 【サンプルデータ】 CREATE TABLE t1 ( col1 integer ,col2 integer ,val integer ); INSERT INTO t1 VALUES( 1, 1, 1, ); INSERT INTO t1 VALUES( 1, 1, 1, ); INSERT INTO t1 VALUES( 2, 1, 1, ); INSERT INTO t1 VALUES( 2, 1, 1, ); INSERT INTO t1 VALUES( 3, 2, 1, ); INSERT INTO t1 VALUES( 3, 2, 1, ); INSERT INTO t1 VALUES( 4, 2, 1, ); INSERT INTO t1 VALUES( 4, 2, 1, ); ※ここでcol1、col2ともどんなデータが入っているか、わからないとします。 なので、まずcol2をDISTINCTしたものを求めました。 SELECT DISTINCT col2 FROM t1; この結果をカーソルを使ってループし、動的にカラムを作成するSQLを 作りました。 DECLARE cu refcursor; rec record; str text := 'SELECT col1 '; str2 text := ' FROM t1 GROUP BY col1 ORDER BY col1'; BEGIN OPEN cu FOR EXECUTE SELECT DISTINCT col2 FROM t1; LOOP FETCH cu INTO rec; IF NOT FOUND THEN EXIT; END IF; str := str || ', SUM( CASE WHEN col2 = rec.col2 THEN val END ) AS col_name' || rec.col2; END LOOP; CLOSE cu; RAISE INFO 'key = %', str || str2;  動的に生成されたSQLを実行したい ------------------------------------------------------- ※ちなみに動的に生成されたSQLはこんな感じになります。 SELECT col1 ,SUM( CASE WHEN col2 = 1 THEN val END ) AS col_name1 ,SUM( CASE WHEN col2 = 2 THEN val END ) AS col_name2 FROM t1 GROUP BY col1 ORDER BY col1; ------------------------------------------------------- あとがわかりません。。動的なカラムなので、どうやって取得すれば 良いのでしょうか? レコード型を使うと上手くいくのでしょうか? 試しにFUNCTION( func1 )の戻り値をRETURNS SETOF record として 内部で rec1 record; : :  FOR rec1 IN EXECUTE str || str2 LOOP RETURN NEXT rec1; END LOOP; RETURN; SELECT * FROM func1(); とやってみたら、 ERROR: a column definition list is required for functions returning "record" となります。。。 カラムの定義が必要だと言われているんだと思いますが、カラムは 動的になっているので、どうすれば良いのでしょうか??

  • SQL-SELECT文でのソート

    VB2010とmdb(Ms-Access)にてシステムを構築しています。 Select文にて取得したレコードをDatagridviewにて表示しようとしているのですが SQL="SELECT * FROM table ORDER BY ID" 当のシンプルなものだと表示できるのですが 特定の文字列順にソートしたくCASE WHENを使用して SQL = "SELECT * FROM table ORDER BY CASE BUPPIN WHEN '○○' THEN 1 WHEN '△△' THEN 2 ELSE 0 END" のようにSQLを書いてみたのですがデータアタプタにてデータテーブルに結果を入力させる際にエラーが出てしまいます。 構文間違いでしょうか? ご教授お願いします

  • ASで指定した項目名をGROUP BYやORDER BYで使用する方法。

    ただいまSQLの勉強をしています。 タイトルどおりなのですが、ASで指定した項目名をGROUP BYやORDER BYで使用する方法はあるのでしょうか? CASE文を使用したこちらのSQL文↓で、SELECT文、GROUP BY句、ORDER BY句の中に重複する部分が多く出てしまうのでどうにかすっきりさせたいと思い、独自に調べたり色々と試したのですがわからず、質問させていただきました。 お分かりになる方、いらっしゃいましたらご助言どうぞよろしくお願いいたします。 <SQL文> SELECT CASE WHEN trancd % 3 = 1 THEN '購入番号(1,4,7,…)の集計' WHEN trancd % 3 = 2 THEN '購入番号(2,5,8,…)の集計' ELSE '購入番号(3,6,9,…)の集計' END AS グループ名称 , sum(suryo) AS 数量合計 FROM tran GROUP BY CASE WHEN trancd % 3 = 1 THEN '購入番号(1,4,7,…)の集計' WHEN trancd % 3 = 2 THEN '購入番号(2,5,8,…)の集計' ELSE '購入番号(3,6,9,…)の集計' END ORDER BY CASE WHEN trancd % 3 = 1 THEN '購入番号(1,4,7,…)の集計' WHEN trancd % 3 = 2 THEN '購入番号(2,5,8,…)の集計' ELSE '購入番号(3,6,9,…)の集計' END;

  • oracleでwith句の結果を使ってupdate

    oracleでwith句の結果を使って外部結合?でupdateしたいのですが 上手くいきません。 oracleでは無理なのでしょうか。 よろしくお願いいたします、。 /*---------- with v1 as ( select row_number() over(PARTITION BY ・・・ ORDER BY ・・・) as rnum ,no ,col1 ,・・・ from ・・・ ) update ( select A.col1 A_COL, v1.col2 B_COL from table1 A inner join table2 B on A.cd1=B.cd1 inner join v1 on A.no=v1.no where v1.rnum=1 and ・・・ ) set A_COL=B_COL ; ----------*/ と書いたのですが、 実際に実行してみると、 カッコ「(」、「)」がないとか、 selectが必要とか, A_COLやB_COLが無効ですとか、 となります。 どこが悪いのでしょうか。 oracleではupdateでwithは使えないのでしょうか。 よろしくお願いします。

  • MySQLの文法について

    MySQL初心者です 以下の文法でおかしなところがあったら直していただきたいのですが… テーブルの内容などは関係なく,文法がおかしいか見ていただきたいです バージョンは6.0.6を使っています select c_count, count(*) as custdist from ( select c_custkey, count(o_orderkey) from customer left outer join orders on c_custkey = o_custkey and o_comment not like '%special%products%' group by c_custkey ) as c_orders (c_custkey, c_count) group by c_count order by custdist desc, c_count desc; よろしくお願いします><

  • mysqlの操作について

    データを名前を検索し、さらに値段の昇降順に 並べたいのですがどのように入力すれば 表示されるのかわかりません! mysql> select * from shop order by price ASC; と mysql> select * from shop where name like '%java%';といった別々に検索はできるのですが 同時に検索したいのです。どばたかお願いします

    • ベストアンサー
    • MySQL
  • MYSQL like % の使い方

    テーブルA  id phone ---------------- 1 8199992222 2 8211113333 3 8211114444 4 85233334444 テーブルB id Prefix name ------------------------- 1 81 Japan 2 82 Korea 3 852 Hong Kong テーブルBは使わず、 SELECT a.id, a,Phone, Case when a.Phone like '81%' then 'Japan' when a.Phone like '82%' then 'Korea' when a.Phone like '852%' then 'Hong Kong' else null end FROM テーブルA as a とすると、下記のようになると思いますが、”like '82%'” の部分がたくさんあり、1つづつ全て書くことができません。 一覧が テーブルBにあるPrefix なので、こちらを使って効率よくできませんでしょうか。 id phone name -------------------------------- 1 8199992222 Japan 2 8211113333 Korea 3 8211114444 Korea 4 8523334444 Hong Kong MYSQL ver: 5.0.51a 他必要な情報があればお知らせください。 宜しくお願いします。

  • MySQLでの集計

    いつもお世話になっております。MySQLを利用しておりまして質問です。 同じ構成のテーブルが5つあり、選択されたテーブルを集計するSQLを作成しています。 カラムを簡単に構成を書くと ID、名前、ステータス1、ステータス2 のような形です。 テーブル1、2、3が選択された場合 テーブル1と2でIDの重複のない一覧を作成し、IDが被っていた場合はステータスをそれぞれ大きいほうを保持するようにします。 そして次にテーブル1、2を合わせたテーブルとテーブル3で同じように集計をしたいのですが、ここがうまく出来ません。 実際の環境ではなく簡素化したものなのでおかしな点があるかもしれませんがこのようになっています。 SELECT TTT1.id,TTT1.名前,TTT1.st1,TTT1.st2 FROM(     SELECT id,名前,ステータス1 as st1,ステータス2 as st2     FROM(        SELECT *        FROM テーブル1 T1        WHERE T1.id NOT IN(SELECT T2.id FROM テーブル2 T2)        UNION All        SELECT *        FROM テーブル2 T2        WHERE T2.id NOT IN(SELECT T1.id FROM テーブル T1)     ) as TT1     UNION     SELECT id,名前,st1,st2     FROM(         SELECT T1.id,T1.名前,         (CASE T1.ステータス1 or T2.ステータス1 WHEN "2" THEN "2" WHEN "1" THEN "1" WHEN "0" THEN "0" ELSE null END) as st1,         (CASE T1.ステータス2 or T2.ステータス2 WHEN "2" THEN "2" WHEN "1" THEN "1" WHEN "0" THEN "0" ELSE null END) as st2,         FROM テーブル1 T1,テーブル2 T2         WHERE T1.id = T2.id AND NOT(T1.st1 IS null AND T1.st2 IS null AND T2.st1 IS null AND T2.st2 IS null) ) as TT2 )as TTT1 /* UNION ALL SELECT id,名前,st1,st2 FROM (TTT1とテーブル3を比較したもの)as TTT2 */ /**/で囲ったところでTTT1が呼び出せれば、テーブル1のところをTTT1にし、テーブル2をテーブル3にすれば出来ると思うのですが、そういうことは無理なのでしょうか? また集計するテーブルの数が不特定なので一つずつ集計をする形を取りましたが、 もっとこういう風にやればいいと言う方法はございますでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • MySQL