2016-12-30 151 views
0

你好,我想从我的查询得到正确的总和,我知道这个工程:SQL SUM返回错误的结果

SELECT SUM(AMOUNT) From IncomingInvoiceLine inner Join [File] ON IncomingInvoiceLine.FILENUMBER = [File].FILENUMBER WHERE [File].RELATIONCODE = '12TU01' 

但是,这是我想这被计算所以没有货币量:

SELECT fmsTotalAmountIncoming INTO TempIncomingAmounts FROM (
     SELECT SUM(CASE WHEN fms1.currency != 'EUR' 
      THEN fms1.amount * fms1.rate 
     ELSE ISNULL(fms1.amount, 0) END) fmsTotalAmountIncoming 
    FROM [fms].[dbo].[IncomingInvoiceLine] fms1 
    WHERE fms1.RELATIONCODE = '12TU01' 
    ) a 

    SELECT fmsTotalAmountIncoming FROM [fms].[dbo].[TempIncomingAmounts] 

    DROP TABLE [fms].[dbo].[TempIncomingAmounts] 

而且这不会返回正确的结果,它在第一查询返回返回NULL:

8145.46

但我想不通,为什么在货币查询被转换返回null。它应该返回

8106.546

(我第一次在vb.net使这个当时就想通过写一个存储过程,使其更快)。

有没有人看到它为什么这样做?

+0

尝试在乘法做一个空检查:'ISNULL(fms1.amount * fms1.rate,0)'。 –

+0

这没有什么区别。关系代码123K01应该返回0,并返回4927.16,我不知道这个数字来自哪里。 –

+0

然后取出款项,并将所有值,因此可以确保您比较喜欢像..你也应该然后找到在第二个查询的38.914 :) – BugFinder

回答

0

到底这个问题是我的愚蠢,我试图直接从IncomingInvoiceLine得到它,而我需要内部加入文件。现在它可以运行,使用这个:

SELECT fmsTotalAmountIncoming INTO TempIncomingAmounts FROM (
    SELECT SUM(CASE WHEN fms1.currency != 'EUR' 
     THEN fms1.amount * fms1.rate 
    ELSE ISNULL(fms1.amount, 0) END) fmsTotalAmountIncoming 
FROM [fms].[dbo].[file] f 
    INNER JOIN [fms].[dbo].[incominginvoiceline] fms1 ON 
    fms1.filenumber = CONVERT(NVARCHAR, f.filenumber) 
    WHERE f.RELATIONCODE = @RelationCode 
) a 

谢谢你的所有帮助!

0

这是因为我们的fms1.amount * fms1.rate。

房价资料,请X.XX,将其转换为相同的格式amount

它可以相反。添加更多信息(数据的数据类型和速率的数据类型)以获得更详细的答案。

1

我想你的乘法可能会导致问题。因为我已经尝试过同样的问题,一些虚拟的数据,它是给予准确的结果意味着它没有给予任何空值

SELECT fmsTotalAmountIncoming INTO TempIncomingAmounts FROM (
    SELECT SUM(CASE WHEN fms1.currency != 'EUR' 
     THEN fms1.amount * 0.5 
    ELSE ISNULL(fms1.amount, 0) END) fmsTotalAmountIncoming 
FROM [fms].[dbo].[IncomingInvoiceLine] fms1 
WHERE fms1.RELATIONCODE = '12TU01' 
) a 

SELECT fmsTotalAmountIncoming FROM [fms].[dbo].[TempIncomingAmounts] 

DROP TABLE [fms].[dbo].[TempIncomingAmounts] 

如果上面的查询结果正确的结果,那么它的multipilcation问题。

+0

我发现了这个问题。这是因为我们的数据库非常大,有时在我眼中难以辨认。这是错误的表:) –

0

可能是乘法中的空值之一。 您可以找出以下方式

ISNULL(fms1.amount * fms1.rate,0)