SQLserver2005 nvarchar を float に変換中にエラー発生

このQ&Aのポイント
  • データ型 nvarchar を float に変換中にエラーが発生しました。
  • [CHIBAN]フィールドはnvarchar型のためエラーが発生していると思われます。
  • 強制的にfloat型に変換する原因が不明です。
回答を見る
  • ベストアンサー

SQLserver2005 nvarchar を float に変換中にエラー発生

SELECT TOP (100) PERCENT ACODE * 10 + CCODE AS Aコード, ACODE * 1000 + CCODE * 100 + GCODE AS Bコード, CASE WHEN [GCODE] = 0 THEN [CHIBAN] ELSE [GCODE] END AS 番地, MIN(DISTINCT X) AS X, MIN(DISTINCT Y) AS Y FROM dbo.Tbl GROUP BY ACODE * 10 + CCODE, ACODE * 1000 + CCODE * 100 + GCODE, CASE WHEN [GCODE] = 0 THEN [CHIBAN] ELSE [GCODE] END ORDER BY 字丁目コード, 号特定コード, 番地 上記のクエリを実行すると「データ型 nvarchar を float に変換中にエラーが発生しました。」というメッセージが表示されてしまいます。 おそらく[CHIBAN]フィールドはnvarchar型のためエラーが発生していると思うのですが、 なぜ強制的にfloat型にしようとするのかわかりません。 どのように回避すればよいでしょうか。ご教示のほどお願い致します。

  • kyoh8
  • お礼率80% (8/10)

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

  • ベストアンサー
  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.1

>CASE WHEN [GCODE] = 0 THEN [CHIBAN] ELSE [GCODE] END 上記のCASE文の[GCODE]が数値型のようなので暗黙の型変換が行われているのでしょう。 なので、[CHIBAN]内に文字列が入っていて変換できないのでしょう。 戻り値の型 http://msdn.microsoft.com/ja-jp/library/ms181765.aspx >result_expressions およびオプションの else_result_expression の型のセットの中から、最も優先順位の高い型を返します。詳細については、「データ型の優先順位 (Transact-SQL)」を参照してください。 データ型の優先順位 http://msdn.microsoft.com/ja-jp/library/ms190309.aspx CASTで文字列に明示的に変換すればよいでしょう。 http://msdn.microsoft.com/ja-jp/library/ms187928.aspx データ [GCODE] [CHIBAN] 0 A 0 1 0 3 1 A 1 B エラーケース select CASE WHEN [GCODE] = 0 THEN [CHIBAN] ELSE [GCODE] END AS 番地 from test オッケーケース select [GCODE],[CHIBAN], CASE WHEN [GCODE] = 0 THEN [CHIBAN] ELSE CAST([GCODE] AS nvarchar(10)) END AS 番地 from test GCODE CHIBAN 番地 0 A A 0 1 1 0 3 3 1 A 1 1 B 1 Select時には型を合せましょう。

kyoh8
質問者

お礼

ご親切な回答ありがとうございます。 解決いたしました。 >Select時には型を合せましょう。 Accessで慣れていたもので。。。お恥ずかしいです。 ありがとうございます。助かりました。

関連するQ&A

  • SQLServer2005のSELECT文作成について

    SQLServer2005初心者ですが、おわかりになる方いらっしゃいましたら、教えてください。お願いします。 やりたいことは(下記は間違いのSELECT文ですが) SELECT Nomber , SUM(ISNULL(CASE WHEN KenYY + KenMM = '200711' THEN Siyoryo ELSE 0 END, 0)) AS '2007年11月' , SUM(ISNULL(CASE WHEN KenYY + KenMM = '200712' THEN Siyoryo ELSE 0 END, 0)) AS '2007年12月' ,  MAX(ISNULL(CASE WHEN RecNO = MIN(RecNO) THEN Sedai ELSE '' END, '')) Sedai_MIN ,  MAX(ISNULL(CASE WHEN RecNO = MAX(RecNO) THEN Sedai ELSE '' END, '')) Sedai_MAX FROM TABLE GROUP BY Nomber で、SELECTの最後のSedai_MIN,Sedai_MAXで集計関数を2回使っているので、エラーがでるのは分かるのですが、始めのMAXを消すとGROUPBY句にSedaiとRecNOが含まれていないというエラーがでて、GROUPBYに追加すると、同じNomberが複数でてしまうのです。 同じNomberは1つしか出ないようにする場合、上記のSELECT文をどのように変更すればよろしいのでしょうか? 回答よろしくお願いいたします。

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

  • #ワークテーブルにinsert時 変換エラー

    お伺いします。 SELECT a , WHEN ISNUMERIC(b) = 1 THEN b ELSE 0 END AS b into #hoge from table と言うSQL文があります。 型としましては、 aはdecimal(16.4)、bはnvarchar(256)とします。 bに'999999999'が入っている(9桁)場合は、 正常に値がワークテーブル#hogeに書き込まれますが、 bに'9999999999'が入っている(10桁)場合には、 「nvarchar の値 '9999999999' の変換が int 型の列でオーバーフローしました。整数値の最大値を超えました。」 と怒られてしまいます。 これは何故でしょうか? ちなみに、文字列'9999999999'をbとして直接渡してやっても正常にワークテーブルhogeに書き込まれ、終了します。 数字の場合のみ10桁以上でも書込みを行いたいのですが、出来ずに困っています。 アドバイスありましたら宜しくお願い致します。

  • 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を使用しています。

  • 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;

  • 重複データの集計方法を教えてください。

    テーブル名:テスト コード SEQ 0001  1 0001  2 0001  3 0002  1 0002  2 0002  3 0003  1 0003  2 0003  3 0003  4 0003  5 0003  6 0003  7 0003  8 0004  1 0004  2 0005  1 0005  2 0005  3 0005  4 0005  5 0005  6 0005  7 0005  8 0006  1 0006  2 0007  1 0007  2 こういったデータのテーブルがあります。 そこで、「コード」の重複件数が6件以下の データを集計したいのです。 これで、重複したコードの件数がでると思うのですが、 SELECT COUNT(コード) FROM テスト GROUP BY コード こういうイメージです。 3 3 8 2 8 2 2 6より多いデータは、6にして、それ以外のデータはそのままの値にしたいのです。 CASE WHEN aa > 6 THEN '6' ELSE aa END 上で書いたSELECTの結果を上記のCASEで使いたいのですが、 どのように記述すればよいのでしょうか? 下記のようにしてもうまくいきませんでした。 SELECT CASE WHEN aa > 6 THEN '6' ELSE aa END FROM (SELECT COUNT(コード) FROM テスト GROUP BY コード) as aa 最終的には、 3 3 6 2 6 2 2 となったものの合計を出したいです。 24がでればいいです。 よろしくお願いします。

  • ASPからのSQL文でエラーが発生

    ASPでoracleのデータを集計しようとしたところ、SQL文でエラーが発生してしまいました。 (ORA-00911: 文字が無効です。) 同じSQL文を「SQLPlus Worksheet」で実行してみたら、問題なく実行できました。 エラーの原因を教えてください。 SELECT CASE WHEN 処理CD = '1' AND 集計F = 'Y' THEN '1Y' WHEN 処理CD = '1' AND 集計F <> 'Y' THEN '1N' END AS kubun, COUNT(連番) AS kensu SUM(金額) AS kingaku FROM aaa WHERE 日付 = '200701' GROUP BY CASE WHEN 処理CD = '1' AND 集計F = 'Y' THEN '1Y' WHEN 処理CD = '1' AND 集計F <> 'Y' THEN '1N' END kubun毎に金額の合計値などを集計したいというような感じです。 よろしくお願い致します。

  • SQLのグループ化動作について

    グループ化と集計関数の動作について質問させてください。 MySQL、SQLiteて実行しました。 [テーブル:ninzu_tbl] ken sex ninzu 福岡 1 50 福岡 2 60 佐賀 1 40 佐賀 2 30 長崎 1 60 長崎 2 50 性別(sex)でgroup byして人数を求めるSQLを実行した場合、 sumを使用するSQL(1)を実行すると福岡、佐賀、長崎のそれぞれの人数が表示されますが、 sumを使用しないSQL(2)を実行した場合、長崎の人数のみが表示され、福岡、佐賀の人数が 空白になります。 group byでグループ化した場合に、最後尾のキー項目以外のデータが 上書きされ、福岡、佐賀のデータが飛んでしまったのではと考えましたが、 (1)を実行した場合に県ごとのデータが表示される理由がわかりません。 理由がわかる方、教えていただけませんか? もしくは、グループ化の処理イメージができるサイトを教えてください。 よろしくお願いします。 (1) 結果が表示されるSQL select sex as '性別' , sum(case when ken = '福岡' then ninzu else null end) as '福岡' , sum(case when ken = '佐賀' then ninzu else null end) as '佐賀' , sum(case when ken = '長崎' then ninzu else null end) as '長崎' from ninzu_tbl group by sex (2) 福岡と佐賀の結果が表示されないSQL select sex as '性別' , case when ken = '福岡' then ninzu else null end as '福岡' , case when ken = '佐賀' then ninzu else null end as '佐賀' , case when ken = '長崎' then ninzu else null end as '長崎' from ninzu_tbl group by sex

  • 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;

  • 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