为什么SQL Server在'where'中使用'month'时会返回不同的顺序?

Rum*_*lin 2 sql t-sql sql-server sql-order-by sql-server-2008

我运行一个程序调用,计算表行的总和.首先,我教过程序没有按预期工作,所以我浪费了半天试图修复实际工作正常.

后来我实际上看了一下SELECT屏幕上的数据,并对此感到惊讶:

YEAR(M.date) = 2016
--and MONTH(M.date) = 2
Run Code Online (Sandbox Code Playgroud)

YEAR(M.date) = 2016
and MONTH(M.date) = 2
Run Code Online (Sandbox Code Playgroud)

截图

所以第二个示例返回的排序与第一个不同.

事情是我在全年做计算.显示年+月参数的数据.

有人可以解释为什么会这样,以及如何避免这种情况?

在我的调用SELECTfor on screen数据的过程中,我实现了它:

and (@month = 0 or (month(M.date) = @month))
and year(M.date) = @year
Run Code Online (Sandbox Code Playgroud)

因此,如果用户想要查看全年和年份数据的数据是必需的,则month参数是可选的.

Gor*_*off 7

您按日期列进行排序.但是,日期列不是唯一的 - 多行具有相同的日期.在ORDER BY以任意顺序回报这些.实际上,对于在不同时间运行的同一查询,您可能会得到不同的顺序.

要"修复"此问题,您需要包含对每行唯一的另一列(或列).在您的情况下,这似乎是id列:

order by date, id
Run Code Online (Sandbox Code Playgroud)

另一种思考方式是在SQL中,排序不稳定.也就是说,它们不保留数据的原始顺序.这很容易记住,因为表或结果集没有"原始排序".请记住,表格代表无序集合.