[英]SQL SUM Returns wrong result
您好,我正在尝试从查询中获取正确的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中做到了这一点,然后想通过编写存储过程使其更快)。
有人知道为什么这样做吗?
我认为您的乘法可能会导致问题。 因为我已经用一些虚拟数据尝试了相同的问题,并且给出了准确的结果,这意味着它没有给出任何空值
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]
如果以上查询得出正确的结果,则说明它是多重问题。
这是因为我们的fms1.amount * fms1.rate。
Rate为X.XX格式,将其转换为与amount
相同的格式。
相反。 添加更多信息(金额的数据类型和费率的数据类型)以获得更详细的答案。
可能是乘法中的空值之一。 您可以找出以下方式
ISNULL(fms1.amount * fms1.rate,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
感谢您的所有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.