【问题标题】:SQL SUM Returns wrong resultSQL SUM 返回错误结果
【发布时间】:2016-12-30 09:25:49
【问题描述】:

您好,我正在尝试从我的查询中获取正确的 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 中进行了此操作,然后想通过编写存储过程使其更快)。

有人知道为什么会这样吗?

【问题讨论】:

  • 尝试对乘法进行空检查:ISNULL(fms1.amount * fms1.rate, 0)
  • 这没什么区别。关系码 123K01 应该返回 0,返回 4927.16,我不知道这个数字是从哪里来的。
  • 然后删除总和,并返回所有值,这样你就可以确定你是在比较同类......你还应该找到一个值 38.914 :)
  • 在第二个查询中,您是否故意跳过了 INNER JOIN [FILE]?

标签: sql vb.net tsql


【解决方案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]

如果上面的查询结果正确,那就是乘法问题。

【讨论】:

  • 我发现了问题。这是因为我们的数据库太大了,有时我的眼睛无法阅读。这是错误的表:)
【解决方案2】:

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

Rate 是 X.XX 的格式,将其转换为与 amount 相同的格式。

也可以反过来。添加更多信息(金额数据类型和费率数据类型)以获得更详细的答案。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      最后的问题是我的愚蠢,我试图直接从 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 
      

      感谢大家的帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多