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

标签 sql sql-server sql-server-2008 tsql sql-order-by

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

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

YEAR(M.date) = 2016
--and MONTH(M.date) = 2

YEAR(M.date) = 2016
and MONTH(M.date) = 2

Screenshot

因此第二个示例返回的排序与第一个不同。

问题是我对全年进行了计算。显示年+月参数数据。

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

在我为屏幕数据调用 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/

相关文章:

sql - 将两个 SQL 查询结果合并为一个结果

mysql - LEFT JOIN 2 Table 但只会返回 Table2 中的第一条记录

sql - 需要 .sql 文件

mysql - 如何根据存储在列中的json对象的json键对mysql结果进行排序

sql-server - 胖客户端访问的安全 SQL Server

sql-server - 如何从 Ado.Net 高效调用表值参数

sql-server-2008 - 无法将类型 'System.__ComObject' 的 COM 对象转换为接口(interface)类型 'Microsoft.VisualStudio.OLE.Interop.IServiceProvider'

sql - 为什么这个查询只选择一行?

sql-server - 我们可以完全依赖数据库引擎优化顾问吗?

SQL-如何选择两列中具有相同值的不同行