2009-09-28 4 views
3

각 직원에 대해 가장 큰 판매를 찾고 직원의 이름을 표시하고 싶습니다. MySQL은, 그것은 매우 간단합니다 :Oracle SQL Query : 직원에게 가장 큰 판매 받기

select * 
    from employee, sale 
    where employee.id = sale.employee_id 
    group by employee_id 
    order by sale.total desc 

이 꽤 많은 사람이 기대하는 것, 그것은 직원의 목록을 반환하고, 직원의 행과 최대 판매 기록을 돌려 끝날 것 않습니다.

그러나 Oracle에서는 group by 절이 사용될 때 그룹식이 아닌 열을 반환 할 수 없습니다. 이렇게하면 Oracle에서 내가 할 수있는 일을 "불가능"하게 만들 수 있습니까? 아니면 몇 가지 해결 방법이 있습니까? 어떤 종류의 서브 쿼리를 수행 할 수 있다고 생각하지만, 그렇게하기위한 또 다른 방법이 있는지는 잘 모르겠습니다.

+2

당신이 당신의 쿼리에서 일을 당신이 선택할 수 있습니다 MySQL' 구문 설탕 '의 남용 그룹화 된 쿼리에서 그룹화되지 않은 임의의 값. 선택한 행이 가장 높은 판매가되는 것은 아닙니다. 문서 상태 : 이 기능을 사용할 때 각 그룹의 모든 행은 GROUP BY 부분에서 생략 된 열에 대해 동일한 값을 가져야합니다. 서버는 그룹에서 임의의 값을 반환 할 수 있으므로 모든 값이 동일하지 않으면 결과가 불확실합니다. http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html – Quassnoi

답변

4

select *을 제거하고 필요한 열로 대체 한 다음 모든 "처리되지 않은"열을 기준으로 그룹화하십시오.

당신은 같은 것을하게 될 겁니다 :

select employee.id, employee.name, max(sale.total) 
from employee, sale 
where employee.id = sale.employee_id 
group by employee.id, employee.name 
order by max(sale.total) desc 

그것은 고통 -하지만 단지

+0

*은 간결하게 작성되었습니다. 내 비 - 예를 들어 실제로 열을 지정합니다. 그러나 나는 group by 절에서 복제해야하는 모든 컬럼을 포함시켜야한다는 것을 믿을 수 없을 정도로 짜증나게한다. 그래서, 12 개의 칼럼을 잡아 내 SQL 문을 어리석은보고 괴물로 바꿉니다. 하지만, 최대에 대한 요점은 잘 만들어집니다. – cgp

+0

'*'에 대해 유감스럽게 생각합니다. 그 사람이 약어를 사용하거나 실제로 그것을 실행하고 있다면, 당신은 항상 임의의 인터넷 게시에서 알 수 없습니다. 나는 괴물에 대해 잘 알고 있습니다. "호기심이 많은"데이터베이스 설계로 인해 그룹별로 최대 12 개의 열을 포함시켜야했습니다. 그것은 불쾌했다. –

+0

글쎄, 그냥 주소 테이블에서 최대 12 열을 얻을 꽤 쉽습니다. Addr1, Addr2, City, State, Zip, Country, Long, Lat - 그저 기본 필드 일뿐입니다. – cgp

4

가장 큰 판매량을 얻으려면 max 기능을 사용하여 그룹화 할 수 있습니다.

select e.name, max (s.total) 
    from employee e, sale s 
    where e.id = s.employee_id 
    group by e.name 
    order by s.total desc 
  • 나는 직원 이름이 employee 테이블의 name 컬럼에 있다고 가정을 만들었습니다. 필자는 또한 직원 테이블과 영업 테이블에 별명을 지정했습니다.
  • 직원의 총 매출을 보려면 을 바꿔 sum() 대신 사용할 수 있습니다.
+0

오, 이런, 어쨌든 내가 원하는 것은 최대이지만 이름을 어떻게 얻는 지 알 것입니다. 잘? – cgp

+0

이 정보를 보관하는 테이블/열 이름은 무엇입니까? – akf

+0

직원 미만 ... – cgp

3

하여 그룹에 관련된 모든 열을 추가 - 나는 전에이 여러 번해야 할 일을했을 것 축하해, 너는 위험 할만큼 배웠다!

정말 원하는 것은 각 직원의 가장 큰 판매입니다. 이제 ANSI SQL에 따라 합법적이지는 않지만 sales amount desc로 정렬 한 다음 그룹화하는 것은 MySQL에서 작동합니다. (기본적으로 MySQL은 각 직원의 첫 행을 임의로 잡아 내고 있기 때문에 일종의 "작동"을합니다.)

이 작업을 수행하는 올바른 방법은 사용자가 수행하는 작업의 효과 측면에 의존하는 것이 아닙니다. 필요; 대신 당신은 명시 적으로 당신이 원하는 것을 물어야합니다 : 각 직원을위한 가장 큰 판매. SQL에서의 그 : 당신이 가장 높은 판매와 직원을 선택합니다, 당신은 모든 여기 GROUP BY 필요하지 않습니다

select employee.id, max(sale.total) 
from employee, sale 
where employee.id = sale.employee_id 
group by employee.id 
order by 2 
1

.

SELECT * 
FROM (
     SELECT sale.*, ROW_NUMBER() OVER (ORDER BY total DESC) AS rn 
     FROM sale 
     ) s 
JOIN employee e 
ON  e.id = s.employee_id 
     AND s.rn = 1 

이 총 가장 높은 판매로 단일 행을 선택합니다

당신이 필요로 가장 높은 판매를 선택하고 다시 employees에 다시 가입하는 것입니다.

당신이 당 직원 가장 높은 판매를 선택합니다

, 당신의 쿼리에 PARTITION BY 절을 추가 :

SELECT * 
FROM (
     SELECT sale.*, ROW_NUMBER() OVER (PARTITION BY employee_id ORDER BY total DESC) AS rn 
     FROM sale 
     ) s 
JOIN employee e 
ON  e.id = s.employee_id 
     AND s.rn = 1