2015-12-15 2 views
0

Стол: сотрудникзначения дублирующие Избегайте при группировке таблицы сама по себе

empid depti salary hired_date 
1 1 4000 2012-01-01 
2 1 3000 2015-11-01 
3 1 3000 2015-01-11 
4 2 4000 2015-11-01 
5 1 3000 2014-11-01 
6 2 5000 2015-01-01 

Запрос:

select emp1.empid, emp1.salary as higher, emp2.empid, emp2.salary as lower_sal 
from employee as emp1, employee as emp2 
where emp1.salary >= 4000 and emp2.salary < 4000 
group by emp1.empid, emp2.empid, emp1.salary, emp2.salary 

Над Запросы Результат:

empid higher empid lower_sal 
1 4000 2 3000 
1 4000 3 3000 
1 4000 5 3000 
4 4000 2 3000 
4 4000 3 3000 
4 4000 5 3000 
6 5000 2 3000 
6 5000 3 3000 
6 5000 5 3000 

Ожидаемый результат:

empid higher empid lower_sal 
1 4000 2 3000 
4 4000 3 3000 
6 5000 5 3000 

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

+0

I не может понять, что вы пытаясь сделать, или почему вы ожидаете этого результата. Похоже, вы просто пытаетесь отобразить один результирующий набор в макете с двумя столбцами? –

+0

В частности, почему id 1 относится к id 2, но не к id 3 и 5. Аналогично, почему id 4 относится к id 3, но не к id 2 и 5? –

ответ

0

попробовать следующий запрос

select i1.empid,i1.higher,i2.empid,i2.lower_sal from (
select emp1.empid, emp1.salary as higher,rank() over(order by empid) rnk 
from employee as emp1 
where emp1.salary >= 4000)i1 join(
select emp2.empid, emp2.salary as lower_sal,rank() over(order by empid) rnk 
from employee as emp2 
where emp2.salary < 4000)i2 on i1.rnk=i2.rnk 

результат, как показано ниже

enter image description here

+0

спасибо @ Smart003, это работает точно ... отлично ... – madhan

0

Вы уже пробовали использовать отчетливые? Это предложение, которое вы можете добавить, чтобы указать, что вы не хотите дублировать значения. Добавьте его после «Выбрать».

select distinct emp1.empid, emp1.salary as higher, emp2.empid, emp2.salary as lower_sal 
from employee as emp1, employee as emp2 
where emp1.salary >= 4000 and emp2.salary < 4000 
group by emp1.empid, emp2.empid, emp1.salary, emp2.salary 
+0

Да пробовал с отличным, но возвращает одинаковые повторяющиеся значения. – madhan

0

По моему разумению вы можете использовать кросс применять,

SELECT  * 
FROM  Employee A 
CROSS APPLY (SELECT Min(B.Salary) AS Min_Salary 
      FROM Employee B 
      WHERE B.salary < 4000)B 
WHERE A.Salary >= 4000 
+0

Основным требованием является отображение работника, имеющего зарплату> = 4000, как выше, и зарплату <4000 ниже с empid соответственно. CROSS APPLY возвращает empid of Higher, но я также нуждаюсь в empid ниже. – madhan

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