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

このQ&Aのポイント
  • MySQLの構文エラーについて困っています。エイリアスを付けてみたりしましたがエラーが解消されません。
  • 以下のような取得結果のSQLを作りたいのですが、構文エラーが出ています。
  • 回答をご存じの方、ご回答をお願いします。
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数2

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

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

やってやれないことはないでしょうが、やればいいってもんでもないでしょう。 簡単にSELECTして、並べ替えたらどうですか。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.2

私が回答できるわけではありませんが、起きたエラーのメッセージをそのまま書きましょう。

ss464146
質問者

お礼

ご回答ありがとうございます。 この件に関しまして解決致しました。

関連するQ&A

  • オラクルの文法を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でどのように記述したら良いのでしょうか? 皆様お忙しい中、もし知っている方がいらっしゃいましたらご回答を宜しくお願い致します。

  • SQL分の作り方

    以下のようなテーブルがあります name point date A 1 2014/1/1 B 2 2014/1/1 C 3 2014/1/1 A 1 2014/2/1 B 3 2014/2/1 C 2 2014/2/1 A 2 2014/3/1 B 4 2014/3/1 C 3 2014/3/1 上記のテーブルを name point(2014/1) point(2014/2) point(2014/3) A 1 1 2 B 2 3 4 C 3 2 3 というように並べるにはどのようなSQLを打てばよいでしょうか。 以下のようなSQLを打ってみたらデータ量が多いときになかなか応答が帰ってきません。 SELECT name, ifnull(sum(CASE WHEN date = '2014-01-01' THEN point END),'-') as point(2014/1),ifnull(sum(CASE WHEN date = '2014-02-01' THEN point END),'-') as point(2014/2),ifnull(sum(CASE WHEN date like '2014-03-01' THEN point END),'-') as point(2014/3) FROM tableA GROUP BY name

  • caseを使った条件分岐の加算がうまくいかない

    SQLで条件によって加算するか、しないかを判定したいと思っています。 ■テーブル:test name,flag,number mike,4,1 mike,4,2 mike,5,3 mike,6,4 mike,7,5 mike,8,6 mike,9,7 ■書いたSQL SELECT test.name AS "name", (CASE WHEN flag = '4' THEN sum(number) ELSE NULL END) AS "4", (CASE WHEN flag = '5' THEN sum(number) ELSE NULL END) AS "5", (CASE WHEN flag = '6' THEN sum(number) ELSE NULL END) AS "6", (CASE WHEN flag = '7' THEN sum(number) ELSE NULL END) AS "7", (CASE WHEN flag = '8' THEN sum(number) ELSE NULL END) AS "8", (CASE WHEN flag = '9' THEN sum(number) ELSE NULL END) AS "9" FROM test GROUP BY test.name ■結果 4,5,6,7,8,9 null,null,null,null,null,28 欲しい結果は、フラグが4ののものの合計。flagが「4」の場合は、「3」という結果が返ってきてもらいたいです。 flagが5の場合は、3が返ってきてもらいたいです。 SQLが間違っているのですが、どこが間違っているのかわかりません。どのように修正すればよろしいでしょうか?よろしくお願いします。 環境はSQLiteを使用しています。

  • SQLの構文エラー

    いつもお世話になってます。 現在、VBでSQLを発行し、ACCESSのテーブル(テストデータ)より 値を取得しようとしているのですが、 SQL文の発行時に構文エラーとなってしまいます。 詳細を下記しますので、ご教授頂けたらと思います。 宜しくお願い致します。 【SQL文】 select フィールド1,フィールド2,フィールド3,フィールド4,フィールド5,フィールド6,フィールド7, (CASE WHEN フィールド8='4' or フィールド8='5' then フィールド9*-1 else フィールド9 end)あああ, (CASE WHEN フィールド8='4' or フィールド8='5' then フィールド10*-1 else フィールド10 end)いいい from テストデータ ※フィールド9、フィールド10は数値型、その他はテキスト型です。 実行時エラー'3075' クエリ式'(CASE WHEN フィールド8='4' or フィールド8='5' then フィールド9*-1 else フィールド9 end)あああ'の構文エラー:演算子がありません。

  • 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
  • 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 他必要な情報があればお知らせください。 宜しくお願いします。

  • オーダー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のところで構文エラーになります。 ここをどのように変えれば意図どおりの動きをするようになるのか知りたいです。 よろしくお願いします。

  • CASE文のエラーについて

    下記のように打つと「行1でエラーが発生しました。: ORA-00905: キーワードがありません」というエラーが表示されます。どうすればいいでしょうか? SELECT ENAME AS 名前, SAL AS 給与, CASE SAL WHEN SAL <= 1100 THEN SAL * 1.055 WHEN SAL <=1400 THEN SAL * 1.05 WHEN SAL <=3000 THEN SAL * 1.0 ELSE SAL*1.045 AS 昇給率 FROM EMP;

  • 動的に生成したカラムを使った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" となります。。。 カラムの定義が必要だと言われているんだと思いますが、カラムは 動的になっているので、どうすれば良いのでしょうか??

  • 講座のある日を抽出したい

    以下にある二つのテーブル(coursemaster, opencourses)を結合して 月ごとに講義があるかをo,xで一覧にして[期待結果]の様な表を抽出したいです。 coursemaster テーブル course_id | course_name 1 | 経理講義 2 | 財務講義 3 |  簿記講義 4 | 税理講義 opencoursesテーブル   month course_id 200706 | 1      200706 | 3 200706 | 4 200707 | 4 200708 | 2 200708 | 4 [期待結果]      経理講義 財務講義  簿記講義  税理講義 200706  ○      ×     ○      ○ 200707  ×      ×     ×      ○ 200708  ×      ○     ×      ○ 以下の様なSQL文で表を結合してみたのですが 日付の値が重複されてしまい、期待通りの結果になりません。 誰かご教授いただけないでしょうか? SELECT month AS 開講日 ,CASE WHEN course_name='経理講義' THEN '○' ELSE '×' END AS 経理講義 ,CASE WHEN course_name='財務講義' THEN '○' ELSE '×' END AS 財務講義 ,CASE WHEN course_name='簿記講義' THEN '○' ELSE '×' END AS 簿記講義 ,CASE WHEN course_name='税理講義' THEN '○' ELSE '×' END AS 税理講義 FROM OpenCourses AS OC INNER JOIN CourseMaster AS CM ON OC.course_id = CM.course_id ORDER BY 1 ;