Упорядочить по условию в T-SQL - PullRequest
1 голос
/ 24 июня 2019

У меня есть два столбца результата. Один из них - имя пользователя, а другой - дата-время, которое можно проверить, когда каждый пользователь просматривал сообщение Если пользователь не видел сообщение, значение даты и времени равно NULL.

Я бы хотел заказать такие данные. дата-время равна нулю или не равна нулю, оба расположены в алфавитном порядке. но нулевые данные, а не нулевые данные должны быть разделены.

SELECT u.username AS username,
       MAX(w1.date) AS lastdate
FROM w1
     RIGHT OUTER JOIN user_info u ON w1.userid = u.userid
WHERE u.usergroup = 'student'
GROUP BY username
ORDER BY lastdate,
         username;

Когда я запускаю этот запрос, я могу получить следующий результат: имя пользователя упорядочено по алфавиту, когда дата-время NULL, но когда дата-время не нулевое, оно упорядочено по дате-времени.

Я надеюсь, что вы, ребята, можете понять, если это не достаточно ясно, пожалуйста, оставьте комментарий.

Ответы [ 2 ]

5 голосов
/ 24 июня 2019

Вы можете использовать

order by case when lastdate is null then 0 
              else 1 end, username
4 голосов
/ 24 июня 2019

Я бы порекомендовал использовать left join и сформулировать запрос как:

SELECT u.username AS username,
       MAX(w1.date) AS lastdate
FROM user_info u LEFT JOIN
     w1
     ON w1.userid = u.userid
WHERE u.usergroup = 'student'
GROUP BY u.username
ORDER BY (CASE WHEN w1.date IS NULL THEN 1 ELSE 0 END),
         u.username;

SELECT DISTINCT почти никогда не подходит для GROUP BY.

Я также рекомендую указывать все ссылки на столбцы в запросе, который ссылается на несколько таблиц.

...