web-dev-qa-db-ja.com

SQLでINTをFLOATに変換

私はこのクエリを持っています:

   SELECT sl.sms_prefix, sum( sl.parts ) , cp.country_name, CAST(SUM(sl.parts) AS NUMERIC(10,4)) * CAST(cp.price AS NUMERIC(10,4))
FROM sms_log sl, sms_transaction st, country_prefix cp
WHERE st.customer_id =1
AND st.sendtime >=1329865200
AND st.sendtime <=1330037999
AND st.sms_trans_id = sl.trans_id
AND sl.sms_prefix = cp.prefix
AND st.customer_id = cp.customer_id
GROUP BY sl.sms_prefix
LIMIT 0 , 30

結果:

sms_prefix  sum( sl.parts )     country_name    price   total
==================================================================================
45            2                        Denmark   0.01   0.019999999552965
63            3                        Philippines   2  6

ご覧のとおり、sum( sl.parts )=2"total"と乗算するため、0.01Denmarkに対して正しくありません。合計は0.02である必要があります。

価格フィールドはFLOATで、合計を浮動小数点数にキャストできますか?

よろしく、

22
alkhader

Oracle dbには、intをfloatにキャストするトリックがあります(mysqlでも動作するはずです):

select myintfield + 0.0 as myfloatfield from mytable
30
heximal

@Heximalの答えは機能しますが、個人的にはお勧めしません。

これは、imlicitキャストを使用しているためです。 CASTと入力していませんが、SUM()または_0.0_を同じデータ型にキャストしてから、_+_を実行する必要があります。この場合、優先順位が優先され、両側に浮動小数点が、_+_の結果として浮動小数点が得られます。ただし、SUM(aFloatField) + 0はINTを生成しません。これは、_0_が暗黙的に FLOATにキャストされているためです。

ほとんどのプログラミングの場合、explicitであることがはるかに望ましいことがわかります。物事を偶然、混乱、または解釈に任せないでください。

明示的にしたい場合は、次を使用します。

_CAST(SUM(sl.parts) AS FLOAT) * cp.price
_


NUMERICとFLOAT (浮動小数点の代わりに固定小数点)のどちらが適切か、ルーティングエラーなどに関しては説明しません。必要な場合でも、FLOATは非常に誤用されているので、このテーマについてはすでに多くの記事を読む必要があります。

以下を試して、何が起こるかを確認してください...

_CAST(SUM(sl.parts) AS NUMERIC(10,4)) * CAST(cp.price AS NUMERIC(10,4))
_
33
MatBailie