我运行一个过程调用,计算表格行的总和。首先,我教过程序没有按预期工作,所以我浪费了半天时间试图修复实际工作正常的部分。
后来我实际看了一下在屏幕上获取数据的 SELECT
并对此感到惊讶:
YEAR(M.date) = 2016
--and MONTH(M.date) = 2
和
YEAR(M.date) = 2016
and MONTH(M.date) = 2
因此第二个示例返回的排序与第一个不同。
问题是我对全年进行了计算。显示年+月参数数据。
有人可以解释为什么会发生这种情况以及如何避免这种情况吗?
在我为屏幕数据调用 SELECT
的过程中,我是这样实现的:
and (@month = 0 or (month(M.date) = @month))
and year(M.date) = @year
因此,如果用户想查看全年的数据,则月份参数是可选的,而年份参数是必需的。
最佳答案
您按日期列排序。但是,日期列不是唯一的——多行具有相同的日期。 ORDER BY
以任意顺序返回这些。事实上,对于在不同时间运行的相同查询,您可能会得到不同的排序。
要“修复”此问题,您需要包含每一行唯一的另一列(或多列)。在您的情况下,这似乎是 id
列:
order by date, id
考虑这一点的另一种方式是,在 SQL 中,排序是不稳定的。也就是说,它们不保留数据的原始顺序。这很容易记住,因为表或结果集没有“原始顺序”。请记住,表格代表无序集合。
关于sql - 为什么在 'month' 中使用 'where' 时 SQL Server 返回不同的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35416619/