Sql 所有数据的总和不同于单个数据集的总和
是什么原因导致SQL Server 2016 Express在一次单独运行还是一次对所有数据集进行求和时,对同一数据集返回不同的结果 所有属于销售的交易: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'
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