我鑄造real
到int
和float
到int
和比較兩個這樣的:鑄造REAL爲INT和比較
where
cast(a.[SUM(PAID_AMT)] as int)!=cast(b.PAID_AMT as int)
,但我仍然得到結果,其中兩個是相等的。例如:
+-----------+-----------+------------+------------+----------+
| accn | load_dt | pmtdt | sumpaidamt | Bpaidamt |
+-----------+-----------+------------+------------+----------+
| A133312 | 6/7/2011 | 11/28/2011 | 98.39 | 98.39 |
| A445070 | 6/2/2011 | 9/22/2011 | 204.93 | 204.93 |
| A465606 | 5/19/2011 | 10/19/2011 | 560.79 | 560.79 |
| A508742 | 7/12/2011 | 10/19/2011 | 279.65 | 279.65 |
| A567730 | 5/27/2011 | 10/24/2011 | 212.76 | 212.76 |
| A617277 | 7/12/2011 | 10/12/2011 | 322.02 | 322.02 |
| A626384 | 6/16/2011 | 10/21/2011 | 415.84 | 415.84 |
| AA0000044 | 5/12/2011 | 5/23/2011 | 197.38 | 197.38 |
+-----------+-----------+------------+------------+----------+
這裏是完整的查詢:
select
a.accn,
a.load_dt,
a.pmtdt,
a.[SUM(PAID_AMT)] sumpaidamt,
sum(b.paid_amt) Bpaidamt
from
[MILLENNIUM_DW_DEV].[dbo].[Millennium_Payment_Data_May2011_July2012] a
join
F_PAYOR_PAYMENTS_DAILY b
on
a.accn=b.ACCESSION_ID
and
a.final_rpt_dt=b.FINAL_REPORT_DATE
and
a.load_dt=b.LOAD_DATE
and
a.pmtdt=b.PAYMENT_DATE
where
cast(a.[SUM(PAID_AMT)] as int)!=cast(b.PAID_AMT as int)
group by
a.accn,
a.load_dt,
a.pmtdt,
a.[SUM(PAID_AMT)]
我到底做錯了什麼?我如何只返回不相等的記錄?
我想你從來沒有聽說過的浮點問題?貨幣值應該從不**以浮點類型表示(一方面,您不能完全表示'.1')。其餘的可能只是在某個時候四捨五入,但更喜歡樣本數據來檢查。 – 2012-08-09 21:58:30
@ X-Zero謝謝。我應該鑄造成不同的東西嗎? – 2012-08-09 21:59:19
你應該將**數據存儲爲基於整數的類型(單位爲美分,或者你有什麼)或者固定精度的十進制類型;我相信'DECIMAL'和'NUMERIC'是標準類型,儘管一些RDBMS具有自定義的MONEY(或類似)類型。你不應該爲了比較而投入任何東西,它應該比較恰到好處。請注意,儘管大多數金額可能會在'預計'總額的一分內給出結果,但在某一點之後,「最小」差異會更大(如不能表示1或更小的差異,並且變得更差) – 2012-08-09 22:35:35