Sql 所有数据的总和不同于单个数据集的总和

Sql 所有数据的总和不同于单个数据集的总和,sql,sql-server,Sql,Sql Server,是什么原因导致SQL Server 2016 Express在一次单独运行还是一次对所有数据集进行求和时,对同一数据集返回不同的结果 所有属于销售的交易: SELECT sum(transactionamount) FROM [NewPOS].[dbo].[Transaction] WHERE TransactionDateTime >= '2016-11-26 00:00:00' AND TransactionDateTime <= '2017-11-27 0:0:0'

是什么原因导致SQL Server 2016 Express在一次单独运行还是一次对所有数据集进行求和时,对同一数据集返回不同的结果

所有属于销售的交易:

SELECT sum(transactionamount) 
FROM [NewPOS].[dbo].[Transaction] 
WHERE TransactionDateTime >= '2016-11-26 00:00:00' 
  AND TransactionDateTime <= '2017-11-27 0:0:0' 
  AND transactiontype = 0
选择总和(TransactionMount)
来自[NewPOS].[dbo].[Transaction]
其中TransactionDateTime>=“2016-11-26 00:00:00”
交易日期时间='2016-11-26 00:00:00'
交易日期时间='2016-11-26 00:00:00'
交易日期时间='2016-11-26 00:00:00'

而TransactionDateTime您的
付款
表中有多条记录用于您的
交易ID
s。例如,这意味着人们在同一笔交易中部分用信用卡和现金支付

你可以用电脑找到这个

select distinct TransactionID, count(*)
from Payment
group by TransactionID having count(*) > 1
order by 2 desc
这将显示使用了一种以上付款方式的所有交易

这会影响您的金额,因为
支付
表只涉及这些交易的一部分,而
交易
中的记录保存全部交易金额。当您检查现金是否用于(部分)付款,然后提取交易的全部金额时,您还可以将信用卡支付的部分合计起来


假设
付款
表中有一列
金额
或类似列,您可以通过
联接
解决此问题:

SELECT sum(t.transactionamount) as Incorrect
, sum(p.amount) as Correct
FROM [NewPOS].[dbo].[Transaction] t
INNER JOIN [NewPOS].[dbo].[Payment] p on p.TransactionID = t.TransactionID
WHERE t.TransactionDateTime >= '2016-11-26 00:00:00' 
  AND t.TransactionDateTime <= '2017-11-27 0:0:0' 
  AND t.transactiontype = 0
  AND p.PaymentType = 0
选择总和(t.TransactionMount)不正确
,总和(p.金额)正确无误
来自[NewPOS].[dbo].[Transaction]t
p.TransactionID=t.TransactionID上的内部联接[NewPOS].[dbo].[Payment]p
其中t.TransactionDateTime>='2016-11-26 00:00:00'
而t.TransactionDateTime='2016-11-26 00:00:00'

而t.TransactionDateTime在没有看到实际数据的情况下很难说。我的最佳猜测是,您有多种支付类型的交易。这就可以解释结果了。哇。。我甚至没想到。。虽然这是可能的,但这种情况很少发生,我会注意到这一点。这是一种罕见的情况,这是由您的数字相对较小的差异所暗示的。2016年,对不起,是一个输入错误。您真的确定您不需要一些超过付款类型的交易id吗?我明白您的意思,但在这种情况下,多重事务类型往往非常罕见。@Richard您现在有一个3.5%的错误,可以完全避免。我强烈建议改变你的疑问。我将在我的答案中添加一种方法——假设
付款中有一定金额的话。虽然这是一个有效点——不幸的是,这不是问题所在——但在这段时间内没有使用多种付款类型。有趣的是。。。查询返回的结果与预期的不同。。在我最初的查询中,我的假设正确吗?当一次对所有事务id求和时,它只为每个事务id添加一次总数?例:一笔交易,两笔相同支付类型的交易,只能添加一次,不能添加twice@Richard不它添加
付款
表中的总计。这些是
交易
表的总计。基本上,您可以根据日期和状态等从
交易
中选择您感兴趣的所有交易,然后从
付款
中选择每种类型的金额。
SELECT sum(transactionamount) 
FROM [NewPOS].[dbo].[Transaction] 
WHERE TransactionDateTime >= '2016-11-26 00:00:00' 
  AND TransactionDateTime <= '2017-11-27 0:0:0' 
  AND transactiontype = 0  
  AND TransactionId IN (SELECT TransactionId 
                        FROM payment 
                        WHERE payment.PaymentType = 3)
SELECT sum(transactionamount) 
FROM [NewPOS].[dbo].[Transaction] 
WHERE TransactionDateTime >= '2016-11-26 00:00:00' 
  AND TransactionDateTime <= '2017-11-27 0:0:0' 
  AND transactiontype = 0  
  AND TransactionId NOT IN (SELECT TransactionId 
                            FROM payment 
                            WHERE payment.PaymentType = 0 
                               OR payment.PaymentType = 2 
                               OR payment.PaymentType = 3)
SELECT sum(transactionAmount) 
FROM [NewPOS].[dbo].[Transaction] 
WHERE TransactionDateTime >= '2016-11-26 00:00:00' 
  AND TransactionDateTime <= '2017-11-27 0:0:0' 
  AND transactiontype = 0  
  AND TransactionId IN (SELECT TransactionId 
                        FROM payment 
                        WHERE payment.PaymentType = 0 
                           OR payment.PaymentType = 2 
                           OR payment.PaymentType = 3)
select distinct TransactionID, count(*)
from Payment
group by TransactionID having count(*) > 1
order by 2 desc
SELECT sum(t.transactionamount) as Incorrect
, sum(p.amount) as Correct
FROM [NewPOS].[dbo].[Transaction] t
INNER JOIN [NewPOS].[dbo].[Payment] p on p.TransactionID = t.TransactionID
WHERE t.TransactionDateTime >= '2016-11-26 00:00:00' 
  AND t.TransactionDateTime <= '2017-11-27 0:0:0' 
  AND t.transactiontype = 0
  AND p.PaymentType = 0
SELECT distinct t.TransactionID
, p.PaymentType
, sum(p.amount) as [Amount paid with this type]
FROM [NewPOS].[dbo].[Transaction] t
INNER JOIN [NewPOS].[dbo].[Payment] p on p.TransactionID = t.TransactionID
WHERE t.TransactionDateTime >= '2016-11-26 00:00:00' 
  AND t.TransactionDateTime <= '2017-11-27 0:0:0' 
  AND t.transactiontype = 0