SQL选择查询由DESC返回错误的顺序

时间:2019-04-26 05:52:10

标签: sql sql-server sql-server-2008

这是我的查询,未返回RegistrationDate Desc排序的正确结果:

SELECT
    Team,
    CONVERT(VARCHAR(10), RegistrationDate, 103) AS RegistrationDate,
    FormFilledAt, CreationBy 
FROM
    Table_Candidate_Info 
WHERE
    Status = 'Completed'  
GROUP BY
    Team, CONVERT(VARCHAR(10), RegistrationDate, 103), FormFilledAt, CreationBy 
ORDER BY 
    RegistrationDate DESC

如果我要使用此查询,它将以RegistrationDate Desc

返回正确的顺序
select * 
from Table_Candidate_Info 
order by RegistrationDate desc

我希望上面的第一个查询应该是Desc的RegistrationDate顺序和按查询的分组

3 个答案:

答案 0 :(得分:1)

尝试

order by CONVERT(VARCHAR(10),RegistrationDate,103) desc

或者更好,如果您想真正按日期(而不是文本)保持顺序,请尝试以下操作:

select Team, CONVERT(VARCHAR(10),RegistrationDate,103) as RegistrationDate, FormFilledAt,CreationBy  
from (
        Select Team, cast(RegistrationDate as date) as RegistrationDate ,FormFilledAt,CreationBy 
        from Table_Candidate_Info 
        where Status='Completed'  
        group by Team,cast(RegistrationDate as date)  ,FormFilledAt,CreationBy
) tmp 
order by RegistrationDate desc

注意:如果要按日期和时间分组,请删除演员表…作为日期

答案 1 :(得分:1)

distinct子句中使用CONVERT(VARCHAR(10),RegistrationDate,103)order by

Select distinct Team,CONVERT(VARCHAR(10),RegistrationDate,103)as RegistrationDate ,FormFilledAt,CreationBy 
from Table_Candidate_Info where Status='Completed'  
order by CONVERT(VARCHAR(10),RegistrationDate,103) desc

注意:由于您没有使用任何聚合函数,因此不需要分组依据

答案 2 :(得分:1)

RegistrationDate子句中将结果转换为varchar时,Select不按结果排序的原因是因为Order By子句在评估后被逻辑处理(位于Select子句中)。 现在,在您写第一个查询时

Select * from Table_Candidate_Info order by RegistrationDate desc

[尽管在选择列表中写*是非常不习惯的做法] RegistrationDate格式仍保留在Select子句中,但在Order By子句的进一步逻辑处理阶段仍然适用。因此,31.01.2019首先出现,31.12.2018之后出现。

但是,当您将其转换为varchar(10)以获得所需的格式时,实际上Order By子句将对Varchar而不是Date进行排序。因此,31/12/2018首先出现,31/01/2019之后出现。

要解决此问题,如果您想保留Select中datetime / date列的格式,但将Order By保留为Date的值,则只需将datetime列转换回{{1} }在Date子句中。

伪代码为:

Order by

此处的演示链接:https://rextester.com/WMLQL78387