Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么SQL Server在使用';月份';在';哪里';?_Sql_Sql Server_Sql Server 2008_Tsql_Sql Order By - Fatal编程技术网

为什么SQL Server在使用';月份';在';哪里';?

为什么SQL Server在使用';月份';在';哪里';?,sql,sql-server,sql-server-2008,tsql,sql-order-by,Sql,Sql Server,Sql Server 2008,Tsql,Sql Order By,我运行了一个过程调用,该过程将总和计算到表行中。首先,我告诉大家,这个过程并没有像预期的那样有效,所以我浪费了半天的时间试图修复实际有效的问题 后来,我实际查看了屏幕上获取数据的SELECT,并对此感到惊讶: YEAR(M.date) = 2016 --and MONTH(M.date) = 2 及 因此,第二个示例返回的排序与第一个不同 问题是我一整年都在计算。显示年+月参数的数据 有人能解释为什么会发生这种情况以及如何避免这种情况吗 在为屏幕数据调用选择的过程中,我将其实现如下: and

我运行了一个过程调用,该过程将总和计算到表行中。首先,我告诉大家,这个过程并没有像预期的那样有效,所以我浪费了半天的时间试图修复实际有效的问题

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

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

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

问题是我一整年都在计算。显示年+月参数的数据

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

在为屏幕数据调用
选择
的过程中,我将其实现如下:

and (@month = 0 or (month(M.date) = @month))
and year(M.date) = @year

因此,如果用户希望查看全年的数据,则月份参数是可选的,而年份参数是必需的。

您是按日期列排序的。但是,日期列不是唯一的——多行具有相同的日期。
orderby
按任意顺序返回这些值。事实上,对于在不同时间运行的同一查询,您可能会得到不同的排序

若要“修复”此问题,您需要包含另一列(或多列),该列对于每一行都是唯一的。在您的情况下,这似乎是
id
列:

order by date, id

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

事实上,这解决了我的问题。我也可以通过将实际时间戳保存到[date]字段中来解决这个问题,但我不能对较旧的记录这样做,所以我将[id]字段放在order by中。谢谢,你有领带。如果您只按有关系的列排序,SQL Server可以为具有相同值的所有行自由选择它想要的任何顺序。如果您想要可预测的排序,请确保您的ORDER BY可以对每一行进行排序,因此您需要ORDER BY命名足够多的列,以便组合是唯一的,或者是唯一到足以产生影响的(例如,
按M.date订购,sumamount DESC
可能就足够了,但如果与
sumamount
也有关联,并且这很重要,您需要添加第三列)。
order by date, id