2012-08-09 85 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