- PR -

分数から分子を取出し、それをサマリーする方法について

投稿者投稿内容
ひろ
ベテラン
会議室デビュー日: 2003/12/26
投稿数: 97
投稿日時: 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
deanna
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 118
投稿日時: 2008-10-09 10:40
引用:

ひろさんの書き込み (2008-10-09 10:24) より:

sum(convert(int,(substring(数量,1,charindex('/',数量)) - 1)))




よく見ると、
substring(数量
,1
,charindex('/',数量)
) - 1
おかしくないですか?
substring(数量,1,(charindex('/',数量) - 1))
ひろ
ベテラン
会議室デビュー日: 2003/12/26
投稿数: 97
投稿日時: 2008-10-09 10:45
ご返答ありがとうございます。
ご指摘の通り修正しましたが、依然同様のエラーが返されます。
括弧を中心に継続して検証します。ありがとうございます。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-10-09 10:47
引用:

・データ
(table a)
no 数量
1 2/10
2 5/10


1つ、素朴な疑問が。
数量の分母は必ず10なのですか? 分母は考慮しなくても本当に大丈夫?

さらに余計な疑問が。
分母が10固定なのだとしたら、数量を小数(decimal(4,1)とか)で持ってもいいのでは?
ひろ
ベテラン
会議室デビュー日: 2003/12/26
投稿数: 97
投稿日時: 2008-10-09 11:01
引用:

rainさんの書き込み (2008-10-09 10:47) より:
引用:

・データ
(table a)
no 数量
1 2/10
2 5/10


1つ、素朴な疑問が。
数量の分母は必ず10なのですか? 分母は考慮しなくても本当に大丈夫?

さらに余計な疑問が。
分母が10固定なのだとしたら、数量を小数(decimal(4,1)とか)で持ってもいいのでは?



分母は10固定ではありません。
現段階では分母を考慮しなくても大丈夫です。
タコツボ
常連さん
会議室デビュー日: 2004/01/20
投稿数: 22
お住まい・勤務地: 京都・大阪
投稿日時: 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)の切り出しができていないと思われますが。
ひろ
ベテラン
会議室デビュー日: 2003/12/26
投稿数: 97
投稿日時: 2008-10-09 11:40
引用:

タコツボさんの書き込み (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)の切り出しができていないと思われますが。




ご返答ありがとうございます。
段階的に確認した結果、ここに記載していない部分でエラーが発生しておりました。
大変申し訳御座いません。

-----------------------------------------------------------
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 ]
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-10-09 12:02
case文での分岐と、sum() による合計を一緒にやろうとして失敗している風ですので、いったん

no tmp
1 2
2 5
3 10

のような結果を取得するようなクエリを書いて、そのtmp列に対して sum() で合計してあげればいいんじゃないでしょうか。

スキルアップ/キャリアアップ(JOB@IT)