2012-01-11 2 views
3
SELECT empno, deptno 
dense_rank() OVER (PARTITION BY deptno 
    ORDER BY sal NULLS LAST) SRLNO 
FROM emp 
WHERE deptno IN (10, 20) 
group by empno, deptno --,sal 
ORDER BY deptno, SRLNO; 

Sal이 group by 절에 있어야하므로이 쿼리가 작동하지 않았습니다. 누구나 왜 그런지 설명 할 수 있고, 그룹 별 절을 변경하지 않고 동일한 선택에서 순위를 얻는 대안이 있습니까? 급여만으로 순위를 주문하고 싶습니다.오라클의 dense_rank() 분석 함수

SELECT empno, deptno,sum(sal) 
    dense_rank() OVER (PARTITION BY deptno 
    ORDER BY sal NULLS LAST) SRLNO 
    FROM emp 
    WHERE deptno IN (10, 20) 
    group by deptno,commision --,sal 
    ORDER BY deptno, SRLNO; 
:


가 emp 테이블의 다른 열 이름 commision이고 내가 DEPTNO에 의해서만 DEPTNO와 commision 및 파티션에 의해 그룹에 있다고 가정하자 편집, 그래서 제안 된 해답이 될 것입니다

어떻게 지금 deppt와 commision으로 그룹화하고 deptno로 파티션 만 할 수 있습니까?

다른 ON I GROUP BY 열 및 RANK 찾기 ON differnt 한 열을 기준으로 파티션에 기반 할 수있는 방법

답변

5

하지 group by 아무것도 - 당신의 partition by 당신을 위해 않습니다! 더 구체적으로

, 당신은 당신의 partition byorder bysal를 참조하고 있기 때문에, group by 그 BU 결과 그룹으로 인식 할 필요가있다. 그러나이 경우 dense_rankpartition by 절에서 자체 파티션을 사용하고 있기 때문에 group by에있는 내용을 따르지 않으므로 group by이 필요하지 않습니다. 당신의 편집에 관한

, 거기 over 절을 사용

sum(sal) over (partition by deptno, commission) as salsum

+0

: 솔루션을 주셔서 감사합니다,하지만 내가 어떻게 그룹을 다른 열 및 다른 파티션에 따라 순위를 찾을 수에 의해 할 수 있습니까? –

+0

@ user1138658 - 내가 편집 한 것처럼, 다른 입도를 가지고 있다면 '이상'을 사용하고 싶을 것입니다. 일단'over' 세계로 향하면,'group by '을 피하고 싶습니다. (할 수 있습니다, 정말 까다 롭습니다). – Eric

+0

: 동의 해 주셔서 감사합니다 :) –