您好我正在尝试从我的查询中获取正确的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 :(得分: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
感谢您的帮助!