Запрос выбора SQL, возвращающий неправильный порядок по DESC - PullRequest
1 голос
/ 26 апреля 2019

Это мой запрос, который не возвращает правильный результат, упорядоченный по 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

Я хочу, чтобы первым запросом был порядок RegistrationDate по Desc с группой по запросу

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

используйте 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

Примечание. Группировка не требуется, поскольку вы не используете агрегированную функцию

1 голос
/ 26 апреля 2019

Причина, по которой результаты не упорядочиваются RegistrationDate при преобразовании его в предложение varchar in 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, но Order By со значением Date, тогдапросто приведите столбец datetime обратно к Date в Order by предложении.

Псевдокод:

select CONVERT(VARCHAR(10),RegistrationDate,103) as RegistrationDate from 
Table_Candidate_Info 
order by cast(RegistrationDate as Date) desc -- cast it back to date

Демонстрационная ссылка здесь: https://rextester.com/WMLQL78387

1 голос
/ 26 апреля 2019

Попробуйте

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

Примечание: если вы хотите группировать по дате + времениудалить актерский состав ... как дата

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...