2012-12-10 2 views
-1

나는 직원 수와 평균 급여를 얻을 수 있지만 평균을 밑도는 직원 수를 나열하는 추가 선택을 시도하면 실패합니다.평균 급여보다 적은 급여를받는 모든 직원을 어떻게 구할 수 있습니까?

select count(employee_id),avg(salary) 
from employees 
Where salary < avg(salary); 
+0

나는 당신이 WHERE 절 대신 HAVING 절을 필요가 있다고 생각합니다. – ceejayoz

+3

제목이 원래 작성한 키워드가 아닌 실제 영어 문장을 사용하십시오. – meagar

답변

3
select count(*), (select avg(salary) from employees) 
from employees 
where salary < (select avg(salary) from employees); 
1
select TotalNumberOfEmployees, 
      AverageSalary, 
      count(e.employee_id) NumberOfEmployeesBelowAverageSalary 
    from (
      select count(employee_id) TotalNumberOfEmployees, 
        avg(salary) AverageSalary 
       from employees 
     ) preagg 
left join employees e on e.salary < preagg.AverageSalary 
group by TotalNumberOfEmployees, 
      AverageSalary 

참고 : 나는 LEFT 당신이 3 명 동일한 직원이 있다면 그래서, 대신 어떤 결과 0 (평균 아래 아래 아무도)을 보여줄 것 조인 사용.

+0

+1 윈도우 화 함수로 이것을 수행하는 합리적인 방법이 있다면 여전히 해결하려고 노력하고 있습니다.) –

1

AVG은 집계 함수입니다. SQL은 행 내에서 집계 된 결과를 혼합하는 방법을 파악할만큼 똑똑하지 않습니다. 기존 방법은 조인을 사용하는 것입니다.

select count(*), avg(e.salary), 
     sum(case when e.salary < const.AvgSalary then 1 else 0 end) as NumBelowAverage 
from employees e cross join 
    (select avg(salary) as AvgSalary from employees) as const 
+0

+1이 경우에는 필터로 크로스 조인을 사용할 수도 있고 간단한 카운트 (*)를 사용할 수도 있습니다 OP는 총 직원 수를 요구하지 않았기 때문에. –

1

결과 집합에서 원하는 열이 명확하지 않아 질문에 대답하기가 어렵습니다. 질문을 명확하게하면 대답의 질이 향상됩니다. 직원의

  1. 번호 :

    당신은 3 사실을 원하는 것 같다.

  2. 평균 봉급.
  3. 평균 급여보다 적은 수입을 가진 종업원 수.

그리고 첫 번째 두 가지 사실에 대한 작업을 수행하는 쿼리를 보여

SELECT COUNT(*) AS NumberOfEmployees, 
     AVG(Salary) AS AverageSalary 
    FROM Employees 

COUNT(*)COUNT(Employee_ID)의 차이는 무엇입니까? 차이점은 후자는 Employee_ID 열에 NULL이 아닌 값이있는 행만 계산한다는 것입니다. 좋은 옵티마이 저는 Employee_ID가 기본 키이고 NULL 값을 포함하지 않으며 쿼리가 동일 함을 인식합니다. 그러나 COUNT(*)은 더 일반적이며 옵티 마이저에 덜 의존적입니다.

다른 통계는 하위 쿼리를 통해 선택 목록에서 간단한 값으로 생성 할 수 있습니다 :

SELECT COUNT(*) AS NumberOfEmployees, 
     AVG(Salary) AS AverageSalary, 
     (SELECT COUNT(*) 
      FROM Employees 
     WHERE Salary < (SELECT AVG(Salary) FROM Employees) 
     ) AS NumberOfEmployeesPaidSubAverageWages 
    FROM Employees 

많은 상황에서, 그와 같은 하위 쿼리를 작성하는 것이 적절하지 않을 것이다, 그러나 지정된 쿼리의 해석에 대해서는 문제가되지 않습니다.

+0

+1이 내 방식보다 깔끔합니다. –

0
select * from <table name> where salary < (select avg(<salary column name) from <table name>); 

예 :

select * from EMPLOYEE where sal < (select avg(emp_sal) from EMPLOYEE); 
+1

답변을 좀 더 자세하게 설명해야합니다. –

0
SELECT e.ename,e.deptno,e.sal,d.avg 
FROM emp e,(SELECT deptno, avg(sal) avg 
      FROM emp 
      GROUP BY deptno) d 
WHERE e.deptno=d.deptno 
AND 
e.sal < d.avg 
+1

스택 오버플로에 오신 것을 환영합니다! 잠시 시간을내어 도움말 센터에서 [편집 도움말] (// stackoverflow.com/editing-help)을 읽으십시오. 스택 오버플로에서 서식 지정은 다른 사이트와 다릅니다. – FrankerZ

+2

또한이 코드 단편은 질문을 해결할 수 있지만 [설명 포함] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) 정말 게시물의 품질을 향상시키는 데 도움이됩니다. 앞으로 독자의 질문에 답하고 있으며 코드 제안의 이유를 알지 못할 수도 있습니다. 코드와 설명의 가독성을 떨어 뜨리기 때문에 주석을 설명하는 코드를 사용하지 마십시오! – FrankerZ

관련 문제