为什么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