как сортировать данные на основе двух разных (текстовых и числовых) условий на сервере sql?

У меня есть таблица Emp со следующими данными.

Eno    Ename   Location  Deptid
-------------------------------    
1      Alex    Delhi      10
2      John    Mumbai     10
.............................

Вот так у меня есть 1000 записей, мне нужно отсортировать их по столбцу Deptid и Location.

Результат после сортировки должен быть таким (если я сортирую по deptid и location=Mumbai):

Если deptid=10 имеет 300 записей (из которых 150-Дели, 100-Мумбаи, 50-Ченнаи), то я должен сначала получить все записи Мумбаи (только с deptid=10), затем другие местоположения одного и того же deptid, а затем записи из других отделов.


person user3116746    schedule 24.12.2013    source источник
comment
Пожалуйста, покажите желаемые результаты в табличной форме.   -  person Martin Smith    schedule 24.12.2013


Ответы (3)


SELECT Eno, Ename, Location, Deptid 
FROM employee
WHERE Deptid = 10 AND Location = 'Mumbai'
UNION ALL
SELECT Eno, Ename, Location, Deptid 
FROM employee
WHERE Deptid = 10 AND Location <> 'Mumbai'
UNION ALL
SELECT Eno, Ename, Location, Deptid 
FROM employee
WHERE Deptid <> 10

Order by, вероятно, испортит его, если вы не добавите еще один столбец, например

SELECT Eno, Ename, Location, Deptid 
FROM (
SELECT Eno, Ename, Location, Deptid, 1 OrderBy
FROM employee
WHERE Deptid = 10 AND Location = 'Mumbai'
UNION ALL
SELECT Eno, Ename, Location, Deptid, 2 OrderBy 
FROM employee
WHERE Deptid = 10 AND Location <> 'Mumbai'
UNION ALL
SELECT Eno, Ename, Location, Deptid, 3 OrderBy 
FROM employee
WHERE Deptid <> 10) a
ORDER BY OrderBy, Deptid, Location
person Jaques    schedule 24.12.2013
comment
Первый запрос работает нормально, в приведенной выше таблице результатов мне нужны первые 200 строк (в которых EmpId выбирается случайным образом). Я пробовал использовать случайный newid(), но он не работает - person user3116746; 24.12.2013

Попробуй это:

SELECT Eno, Ename, Location, Deptid 
FROM employee
WHERE Deptid = 10
ORDER BY CASE deptid WHEN 10 THEN 0 ELSE deptid END, 
         CASE location WHEN 'Mumbai' THEN 1 WHEN 'Delhi' THEN 2 WHEN 'Chennai' THEN 3 END

ИЛИ

Если вам нужны данные только для deptid = 10, используйте следующий запрос:

SELECT Eno, Ename, Location, Deptid 
FROM employee
WHERE Deptid = 10
ORDER BY deptid, CASE location WHEN 'Mumbai' THEN 1 WHEN 'Delhi' THEN 2 WHEN 'Chennai' THEN 3 END
person Saharsh Shah    schedule 24.12.2013
comment
Но мне нужно выбрать все записи отдела, а не только (deptid=10). Например, у меня есть три записи deptid (10,20,30).. В записях deptid=10 мне нужны сначала все записи Мумбаи, затем записи всех других городов, затем записи всех других отделов.. - person user3116746; 24.12.2013
comment
@user3116746 user3116746 Для этого вам нужно написать оператор case в соответствии с вашими потребностями в ORDER BY. Это даст вам результат в соответствии с вашими потребностями - person Saharsh Shah; 24.12.2013

Попробуй это:

SELECT Eno, Ename, Location, Deptid 
FROM Emp
ORDER BY  DeptId, Location desc

если я понимаю ваше требование .. в противном случае, пожалуйста, объясните это более подробно

person Deepak Arora    schedule 24.12.2013
comment
Это вернет записи по местоположению в алфавитном порядке, но мне нужно, чтобы сначала было указано конкретное местоположение отдела (например, все записи Мумбаи deptid = 10), затем другие местоположения того же отдела, затем записи других отделов. - person user3116746; 24.12.2013