SQL SUM返回错误的结果

时间:2016-12-30 09:25:50

标签: sql vb.net tsql

您好我正在尝试从我的查询中获取正确的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中做了这个,然后想通过编写存储过程让它更快。)

有谁知道为什么会这样做?

4 个答案:

答案 0 :(得分: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]

如果上面的查询得到了正确的结果,那么就会出现多重问题。

答案 1 :(得分:0)

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

费率是X.XX的信息,将其转换为与amount相同的格式。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分: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 

感谢您的帮助!