私はこのクエリを持っています:
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.01
はDenmark
に対して正しくありません。合計は0.02
である必要があります。
価格フィールドはFLOAT
で、合計を浮動小数点数にキャストできますか?
よろしく、
Oracle dbには、intをfloatにキャストするトリックがあります(mysqlでも動作するはずです):
select myintfield + 0.0 as myfloatfield from mytable
@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))
_