2012-08-09 68 views
1

我鑄造realintfloatint和比較兩個這樣的:鑄造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)] 

我到底做錯了什麼?我如何只返回不相等的記錄?

+0

我想你從來沒有聽說過的浮點問題?貨幣值應該從不**以浮點類型表示(一方面,您不能完全表示'.1')。其餘的可能只是在某個時候四捨五入,但更喜歡樣本數據來檢查。 – 2012-08-09 21:58:30

+0

@ X-Zero謝謝。我應該鑄造成不同的東西嗎? – 2012-08-09 21:59:19

+1

你應該將**數據存儲爲基於整數的類型(單位爲美分,或者你有什麼)或者固定精度的十進制類型;我相信'DECIMAL'和'NUMERIC'是標準類型,儘管一些RDBMS具有自定義的MONEY(或類似)類型。你不應該爲了比較而投入任何東西,它應該比較恰到好處。請注意,儘管大多數金額可能會在'預計'總額的一分內給出結果,但在某一點之後,「最小」差異會更大(如不能表示1或更小的差異,並且變得更差) – 2012-08-09 22:35:35

回答

3

我不明白爲什麼會有問題。

查詢返回b(sum(b.paid_amt)Bpaidamt)中支付的總和。 where條款是比較個人支付。這僅表示有多筆付款。

也許你的意圖是不是有HAVING子句:

having cast(a.[SUM(PAID_AMT)] as int)!=cast(sum(b.PAID_AMT) as int) 
2

你可以做一個圓鑄造聲明。

cast(round(sumpaidamt,2) as money) <> cast(round(Bpaidamt,2) as money)

的Sql小提琴展示它是如何工作的http://sqlfiddle.com/#!3/4eb79/1