2012-01-11 11 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句にする必要があるため、この問合せは機能しませんでした。誰もがそれがなぜそうであるか説明してもらえますか?また、group by節を変更せずに同じselectでランクを取得する代替手段はありますか?給料に基づいてランクのみを注文したい。oracleのdense_rank()解析関数

EDIT
だから何を示唆した答えになり、唯一のDEPTNOによってDEPTNOおよびコミッションやパーティションによってグループに別の列名のコミッションは、emp表にあるとし、私が持っている:

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; 

ここで、デプノとコミッションでグループ化し、deptnoでパーティション化する方法を教えてください。

どのようにすることができますI GROUP BY異なる列ON AND ON DIFFERNT COLUMN

答えて

5

BY PARTITIONに基づくRANKを見つけることができません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'を一番下に使いたいでしょう。 'over'の世界に向かうと、' group by'を避けたいと思います(これはできます、それはちょっと難しいことです)。 – Eric

+0

:同意した感謝:) –