• ベストアンサー

@変数の使い方

お世話になります。 以下のようなクエリで、変数にNULLが入ります。 何が悪かったのでしょうか、ご教示ください。 SELECT @change := MAX( 購入日 + INTERVAL 2 YEAR ) as 交換日 FROM テーブル WHERE @change > '2012-04-24' お願いします。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>何が悪かったのでしょうか、ご教示ください。 これはかなりダメダメですね (1)もともとMySQLはユーザー変数の評価順序は定義されていないため、 表記のような書き方はNGです 「ステートメントの一部でユーザー変数値を割り当てないことおよび同一ステートメント内の他部分で同じ変数を使用しないこと」 という原則があります。 http://dev.mysql.com/doc/refman/5.1-olh/ja/user-variables.html (2)仮に評価が順序立ててされたとしても、SELECT で代入されるのを まってからだとWHEREで条件を絞り込む時点では未設定ですよね ロジック自体が変です (3)GROUP BY をしないSQL文でMAXをとっていますがなんの最大値を とりたいのか意味がわかりません 特定条件の購入日を絞り込みたいという意図があるのはなんとなくわかりますので 命題が明確になれば近しいことはできそうな気がしますが、その場合も サブクエリでの処理になるとおもいます。 (4)MAXのとりかたもせめて購入日のMAXをとって2年たした方がいいですね

hornest
質問者

お礼

ありがとうございます、勉強になりました! MAXはごめんなさい、本当は結合しているのですが簡素化するために書き換えた時の残りです; ありがとうございました^^

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

関連するQ&A

  • 列名に変数を使うことはできないのでしょうか?

    SELECT TABLE.field AS @変数名 FROM・・・ とするとエラーになります。 列名に変数を使うことはできないのでしょうか?

  • 抽出が出来ないくらい遅いクエリ

    以下のようなクエリーを作成して検索を 行っているのですが、どうしても抽出が出来ないくらい 遅くどの部分で遅くしているのかが分からないため、 どなたか教えてもらえないでしょうか? ※足りない情報があればすみませんが、仰ってください。 なるべくプログラム(PHP等)を使わずクエリのみで 行いたいので、PHP云々の話しは無しでお願い致します。 最初の抽出テーブル(osi)と次の抽出テーブル(osday) をそれぞれ個別で動かすと普通の速度で抽出が旨く行きます が、それらをくっつけた形 select (省略) from osi,osday where osi.id=osday.id; とすると、抽出が行えない又は非常に遅いとなります。 ///////// 実際のクエリー文です ///////// select osday.odid,odctmid,saitemname,startday,endday from ( select odid,saitemname from order1 as o,sale as s where o.odid=s.saorderid and (o.odshipdue >= '2007-12-1 00:00:00' and o.odshipdue <= '2007-12-18 23:59:59') and (o.odcancelflag='0' or o.odcancelflag is null) and o.odclass<'4' and s.saregular='1' and s.saitemcode in (select itcode from item where itcategory='1') and odmakeday is not null ) osi , ( select odid,max(odctmid) as odctmid,to_char(min(o.odshipday), 'YYYY-MM-DD') as startday,to_char(max(o.odshipday), 'YYYY-MM-DD') as endday from order1 as o,sale as s where o.odid=s.saorderid and (o.odshipdue >= '2007-12-1 00:00:00' and o.odshipdue <= '2007-12-18 23:59:59') and (o.odcancelflag='0' or o.odcancelflag is null) and o.odclass<'4' and s.saregular='1' and s.saitemcode in (select itcode from item where itcategory='1') and odmakeday is not null group by o.odid ) osday where osi.odid=osday.odid; ///////////////////////////////////////////

  • 直近2年度連続で減少していない年度を抽出

    以下のテーブルの様に時系列が抜けているテーブルから直近2年度連続で減少していない年度を 抽出しようとしています。 /* year|sale --------- 1990|50 1992|50 1993|52 1994|55 1997|55 */ /* CREATE TABLE sales2 (year INTEGER NOT NULL , sale INTEGER NOT NULL , PRIMARY KEY (year)); INSERT INTO sales2 VALUES (1990, 50); INSERT INTO sales2 VALUES (1992, 50); INSERT INTO sales2 VALUES (1993, 52); INSERT INTO sales2 VALUES (1994, 55); INSERT INTO sales2 VALUES (1997, 55); */ 以下の記述で直近の年度までなら表示できているとは思うのですが2年連続となると やり方が思いつきません。誰かご教授いただけないでしょうか? select year,sale from sales2 s1 where sale >=(select sale from sales2 s2 where s2.year = (select max(year) from sales2 s3 where s1.year > s3.year)) order by year ;

  • 1レコードのデータを複数行に分け通し番号を付ける

    Access2010にて、1レコードのデータを複数行に分け、追番毎に通し番号を付ける方法がわからず困っています。 テーブル1の様に、1レコードにはデータ格納するカラムが4つしかなく、同じ追番でデータが5個以上ある場合は、次のレコードに同じ追番を入力して5個目以降のデータを格納しているテーブルがあります。 テーブル1 追番 カラム1 カラム2 カラム3 カラム4 1 データ1 2 データ1 データ2 データ3 データ4 2 データ5 データ6 データ7 3 データ1 4 データ1 ・ ・ ・ これをテーブル2の様に1レコードにデータ1個づつ格納し、追番毎の番号を振りたいと思います。 テーブル2 追番 番号 データ 1 1 データ1 2 1 データ1 2 2 データ2 2 3 データ3 2 4 データ4 2 5 データ5 2 6 データ6 2 7 データ7 3 1 データ1 4 1 データ1 ・ ・ ・ クエリ1の様なユニオンクエリで近いかたち(テーブル3)にできたのですが、同じ追番で番号が1~4まで埋まったら、5以降の番号を降る方法が分かりません。 クエリ1 SELECT 追番, 1 AS 番号, カラム1 AS データ FROM テーブル1 WHERE カラム1 Is Not Null UNION ALL SELECT 追番, 2 AS 番号, カラム2 AS データ FROM テーブル1 WHERE カラム2 Is Not Null UNION ALL SELECT 追番, 3 AS 番号, カラム3 AS データ FROM テーブル1 WHERE カラム3 Is Not Null UNION ALL SELECT 追番, 4 AS 番号, カラム4 AS データ FROM テーブル1 WHERE カラム4 Is Not Null; テーブル3 追番 番号 データ 1 1 データ1 2 1 データ1 2 1 データ5 2 2 データ2 2 2 データ6 2 3 データ3 2 3 データ7 2 4 データ4 3 1 データ1 4 1 データ1 ・ ・ ・ よろしくお願いします。

  • select文の戻り値を変数に格納したい。

    select文の戻り値を変数に格納したい。 アクセスの選択クエリで以下の様なクエリをつくる。 select count(管理no) from 割り当てテーブル where 管理no = formのテキストボックスに書かれた値; doCmd.openQueryで実行させると画面が開きクエリの結果が表示される。 この値は必ず一つになるはずでその値を変数に取り込み次の処理を行いたい。 現在はクエリを実行後、フォームを開きなおし別の要素にクエリの結果を 表示させその値を取っている。なるべくならフォームを開きなす事をした くないので最初の実行時に変数として取り込みたい。

  • SQLのmaxで求めた値を変数に代入する

    ex) select max(id) from table でかえってくる値を変数に代入するにはどのようにコーディングすればよいのでしょうか? ExcelVBAを使っています。

  • 副問い合わせの書き方?

    すみません、質問文もどう書いていいか分からないのですが; 以下のような結果を出したい場合 id, 商品名, 購入日, 壊れる日 (商品の壊れる時期を知りたい) ------------------------------------------------------ テーブルリスト: 商品テーブル(商品の内容) ・商品性能テーブル(商品の耐久年数) SQL: SELECT 商品名,購入日, 購入日+INTERVAL (SELECT 壊れる日 FROM 商品性能 WHERE △△) YEAR FROM 商品テーブル ------------------------------------------------------ 馬鹿な頭で考えた結果、 商品を全てリストアップし、その購入日に耐久年数を足した値が欲しい 例: 商品名 、購入日   、壊れる日 ストーブA、2012/01/01、2014/01/01 つまり、購入日にストーブAの持ってる耐久年数を足したいのですが 私の考えるクエリでは、△△の部分が分かりません。 そもそも、このようなクエリではないのでしょうか? どうか、ご教示くださいT-T

    • ベストアンサー
    • MySQL
  • ACCESSのクエリ、SQLに変数を使うのに??

    いつもお世話になっております。 ACCESS初心者です。行き詰ったため質問いたします。 どうか、ご教授お願いします。 アクセスのInsertクエリ実行時に変数を持たせたいです。 VBAコードにて、配列で格納している社員IDを1件ずつループして SyainCDにいれます。そこでSyainCDに値が入るたび、 SyainCDをWhere条件として、InsertSQLを実行したいです。 ■CODE■ SyainCD = SyainId(i) ※コード上ではSyainCDにきちんと値が 入ってきていることは確認済です。 また、SagyoYMD()というユーザ関数を用いて 作業日を取得する関数は正常に取得できます。 関数ではなく、コードの中の変数をSQLに組み込むことは 不可能なのでしょうか?? 実行するとエラーではなく、ダイアログでSyainCD を入力要求 が表示されてしまいます。。。。 ■実行クエリ INSERT INTO wrk_マスタテーブル SELECT * FROM [SELECT qry_ユニオンリンクテーブル.社員CD, qry_ユニオンリンクテーブル.作業日, Q_部署テーブル.部署名 FROM (Q_部署テーブル INNER JOIN ユニオンリンクテーブル ON Q_部署テーブル.社員CD = qry_ユニオンリンクテーブル.社員CD) ]. AS マスタテーブル WHERE マスタテーブル.社員CD = SyainCD AND マスタテーブル.作業日 = SagyoYMD(); よろしくお願いします。

  • 変数の取り扱いについて

    はじめまして。思いっきりSQLSERVERは初心者なんですが宜しくお願いします。 現在SQLSERVER2005です。 ややこしくなるので要点だけ以下まとめています。 変数を利用してレコードを抽出する時なんですが… ALTER PROCEDURE Test @Rank INT BEGIN DECLARE @SELECT AS VARCHAR(100) DECLARE @WHERE AS VARCHAR(100) DECLARE @SQL AS VARCHAR(200) SET @SELECT = 'SELECT * FROM tblA ' SET @WHERE = 'WHERE Rank > ' + @Rank SET @SQL = @SELECT + @WHERE EXEC(@SQL) END 実行すると varchar の値 'WHERE Rank > 'をデータ型 int に変換できませんでした。 となります。 Rank部分が数値なんですが、どのように取扱いすべきなんでしょうか。

  • バラメータクエリVBAで実行

    アクセス初心者です。 バラメータクエリの変数をVBAで渡すにはどうしたらよいでしょうか? 例えば、テーブル1に、NOフィールド(1から100程度の整数)と、価格フィールドがあります。 以下のパラメータクエリをアクセスVBAで実行したいのですが、どう書けばよいでしょうか?(抽出条件 NO=IのIをVBAで定義して結果テーブルに保存) '--------------------------------------------------------------- 'VBAで実行したいパラメータクエリ 'SELECT テーブル1.[NO], テーブル1.価格 INTO 結果テーブル 'FROM テーブル1 'WHERE (((テーブル1.[NO])=[I])); '--------------------------------------------------------------- Dim I As Integer I=3 Dim mySQL As String mySQL = "SELECT テーブル1.[NO], テーブル1.価格 INTO 結果テーブル FROM テーブル1 WHERE (((テーブル1.[NO])=[I]));" この後を教えて下さい。