为什么SQL Server不遵循带有SUM的BODMAS数学规则?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么SQL Server不遵循带有SUM的BODMAS数学规则?相关的知识,希望对你有一定的参考价值。
我昨天遇到了遗留存储过程的一个非常令人困惑的问题,虽然我已经“修复”它,但我不觉得我理解为什么需要它。
BODMAS - 数学运算的顺序:
括号,顺序,分区,乘法,加法,减法
所以,加法发生在减法之前。从技术上讲,它们具有相同的权重并且“同时”发生,因为它们通常相互抵消。
经过同意,我们应该同意以下内容都是正确的:
- 1000 - (300 + 300) = 400
- 1000 - 300 + 300 = 400
- (1000 - 300) + 300 = 1000
但是,SQL将中间值评估为1000.我可以通过添加括号来轻松解决此问题。我担心的是,尽管这个例子简洁明了,当数字300来自Coalesced Sums时,已经有很多括号飞来飞去。完全可行的是,他们可能被BODMAS逻辑后的某个人意外删除,或者在代码优化器中被标记为冗余。
这里有一些代码可以自己试试
CREATE TABLE #TempData ([Number] INT)
INSERT INTO #TempData VALUES(200)
INSERT INTO #TempData VALUES(100)
SELECT 1000 - (SUM(Number) + SUM(Number))
FROM #TempData
SELECT 1000 - SUM(Number) + SUM(Number)
FROM #TempData
SELECT (1000 - SUM(Number)) + SUM(Number)
FROM #TempData
DROP TABLE #TempData
1000 - 300 + 300 = 400
这是错的。
正如你所说,+
和-
同样加权并且同时发生。按照惯例,基本操作都是左关联的,因此从左到右处理一行中相同权重的多个操作符:
1000 - 300 + 300 = ((1000 - 300) + 300
这在任何地方都是如此(数学,SQL,大多数编程语言),所以问题不是SQL和传统数学符号之间的区别,而是对约定的误解。
您对BODMAS的解释完全不正确。乘法/除法和加法/减法实际上没有排序,它们是等价的并且从左边开始计算。
维基百科专门讨论了这一点:
例如,按照“先添加,后减法”的顺序使用[BODMAS]会错误地评估表达式[6]
10 − 3 + 2.
正确的值是9(而不是5,好像首先执行加法,然后结果与减法一起使用)。
以上是关于为什么SQL Server不遵循带有SUM的BODMAS数学规则?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server SUM IF 使用具有多个条件的窗口函数
使用带有 ORDER BY 的 SQL Server 查找累积总和