【发布时间】:2016-12-03 09:42:47
【问题描述】:
什么会导致 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
结果为 134253
所有以现金支付的销售交易:
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)
结果为 56318.5
所有使用信用卡支付方式进行销售的交易:
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 = 2)
结果为 54054.5
所有使用借记卡支付方式进行销售的交易:
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)
结果为 28738.5
将 56318.5 + 54054.5 + 28738.5 相加得到 139111.5
139111.5 显然是 != 134253
这三种交易类型的总和有一个额外的4858.5。
验证我没有遗漏付款类型:
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)
此查询也产生 134253
编辑 2:
似乎对多种支付类型的检查未能检测到它——我发现这个问题很可能正是 steenbergh 的回答中描述的问题:
有 -cash 和 +debit 交易(现金返还通过添加 -cash 支付从抽屉中取出现金,以及 +debit 支付全额 + 现金返还..
这会导致非常古怪的数字,而没有过滤掉现金返还交易数字,因为有 交易被添加两次,一次是现金,一次是借方。..
【问题讨论】:
-
不看实际数据很难说。我最好的猜测是你有多种支付类型的交易。这可以解释结果。
-
哇..我什至没有想到这一点..虽然有可能这样做,但这种情况很少发生,我会调查那个..
-
您的人数差异相对较小,这表明这是一个罕见的场合。
-
2016,抱歉打错了..
-
你真的确定你没有一些交易 id 超过付款类型吗?
标签: sql sql-server