2016-01-25 2 views
-1

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

проверка колонки эта картина зарплата

enter image description here

и это выход

enter image description here

это те запросы, которые я попробовать

SELECT MAX(Salary) FROM Employees 
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employees) 

select top 5 salary from Employees; 

ответ

0

Я думаю, что вы делаете это для изучения SQL цели. Таким образом, если вы можете преобразовать столбец зарплаты в целое (Alter table, Alter column), что действительно поможет вам и ваши запросы станут такими же простыми, как показано ниже:

Для второй самый высокий:

SELECT max(salary) 
FROM employees 
WHERE salary < (SELECT max(salary) 
       FROM employees); 

«<» или ' <> 'более эффективны здесь, так как «NOT IN» - это дорогостоящая операция.

и Top 5:

SELECT TOP 5 salary 
FROM employees 
ORDER BY salary DESC; 

Else, как сказано выше, вы должны преобразовать его на лету или дать ряды рядам.

0

. Верхняя функция не должна даваться в первую пятерку зарплаты, но это верхняя запись 5 вершин. Если вы хотите топ-5 зарплату, используя «заказ на» как это ..

select top 5 salary from Employees order by Convert(numeric(18,2),salary) desc; 
+0

Я также делаю это, но это показывает мне тот же результат, что и низкие зарплаты, отображаемые также на выходе .. – scorpio

+0

любые решения, пожалуйста? – scorpio

+0

Тип столбца зарплаты ??? –

2

Причина вы не получаете правильный результат, потому что вы спасаете salary в string. Таким образом, 200 в string будет более 1000 в string. Чтобы сравнить 2 строки, их символы преобразуются в ascii символов, а затем сравниваются на основе ascii символов. Таким образом, ascii значение 2 в 200 более 1 в 1000. Следовательно, неверный результат.

Чтобы дать свой ответ, вы получите оценку в порядке убывания.

SQLFiddle Demo for Top 5

select salary, 
rank() over(order by cast(salary as float) desc) 
as rnk from employee 

Вы можете использовать это, чтобы получить что-нибудь. Как топ-5

select * from 
(select salary,rank() over(order by cast(salary as float) desc) 
    as rnk from employee) 
where rnk <=5 

только второй самый высокий

select * from 
(select salary,rank() over(order by cast(salary as float) desc) 
    as rnk from employee) 
where rnk =2 
+1

Или синтаксис row_number – maSTAShuFu

+0

да, это тоже сработает. – Utsav

Смежные вопросы