- - PR -
分数から分子を取出し、それをサマリーする方法について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-10-09 10:24
お世話になります。以下の点で悩んでおります。
・データ (table a) no 数量 1 2/10 2 5/10 ・クエリ select no, sum(convert(int,(substring(数量,1,charindex('/',数量)) - 1))) from a group by no 数量カラムの、'/'文字列から前(分子)の数値を切り抜き、 その合計を算出したいのですが以下のエラーが返されます。 上記クエリでは、substringの実行結果よりも前にconvertが実行されてしまうのでしょうか。 解決方法をご存知の方ご教授お願い致します。 ・エラー内容 ----------------------------------------------------------- SQLを実行中です... SQL実行中に以下のエラーが発生しました。 エラーコード:245 [Microsoft][ODBC SQL Server Driver][SQL Server]構文エラー。 varchar 値 '10/40' から int データ型に変換できませんでした。 SQLステータス:22005 ----------------------------------------------------------- DB:sqlserver2005 | ||||||||
|
投稿日時: 2008-10-09 10:40
よく見ると、 substring(数量 ,1 ,charindex('/',数量) ) - 1 おかしくないですか? substring(数量,1,(charindex('/',数量) - 1)) | ||||||||
|
投稿日時: 2008-10-09 10:45
ご返答ありがとうございます。
ご指摘の通り修正しましたが、依然同様のエラーが返されます。 括弧を中心に継続して検証します。ありがとうございます。 | ||||||||
|
投稿日時: 2008-10-09 10:47
1つ、素朴な疑問が。 数量の分母は必ず10なのですか? 分母は考慮しなくても本当に大丈夫? さらに余計な疑問が。 分母が10固定なのだとしたら、数量を小数(decimal(4,1)とか)で持ってもいいのでは? | ||||||||
|
投稿日時: 2008-10-09 11:01
分母は10固定ではありません。 現段階では分母を考慮しなくても大丈夫です。 | ||||||||
|
投稿日時: 2008-10-09 11:02
仕様的なものはともかくとして、組み合わせたものが正しく動かないというのであれば、バラして段階的に確認すればよいのではないでしょうか。
(1) select no, substring(数量,1,charindex('/',数量) - 1) from a これで文字列の切り出しが大丈夫であれば (2) select no, convert(int,(substring(数量,1,charindex('/',数量) - 1))) from a として数値変換できるはず。それで大丈夫であればSUMできるはず。 エラーメッセージからは、たぶん(1)の切り出しができていないと思われますが。 | ||||||||
|
投稿日時: 2008-10-09 11:40
ご返答ありがとうございます。 段階的に確認した結果、ここに記載していない部分でエラーが発生しておりました。 大変申し訳御座いません。 ----------------------------------------------------------- select no, case charindex('/',数量) when 0 then sum(convert(int,数量)) else sum(convert(int,(substring(数量,1,(charindex('/',数量) - 1))))) end from a group by no ----------------------------------------------------------- データが以下3番の通り、分数ではない値も含まれるため 上記ケース分で'/'が存在しない場合を判断してサマリーを実行しておりました。 しかし、最初の条件分岐のところに分数の値が来てしまい、エラーが発生しておりました。 「case charindex('/',数量) when 0 then」では、'/'があるかないかを判断できないのでしょうか。 ・データ (table a) no 数量 1 2/10 2 5/10 3 10 [ メッセージ編集済み 編集者: ひろ 編集日時 2008-10-09 11:41 ] | ||||||||
|
投稿日時: 2008-10-09 12:02
case文での分岐と、sum() による合計を一緒にやろうとして失敗している風ですので、いったん
no tmp 1 2 2 5 3 10 のような結果を取得するようなクエリを書いて、そのtmp列に対して sum() で合計してあげればいいんじゃないでしょうか。 |