2017-07-06 11 views
-2

と同じですが、他の誰かがこのクエリを書いています。どのように動作しているか把握しようとしています。私はrow_number()partition bypivotのようなすべてのことについて一般的な考えがありますが、それらをすべて一緒に理解することはできません。このクエリのオラクルの「Partition By」および「Row_Number」キーワードは、ピボット

select 
    d, p, s, a 
from 
(
    select name,occupation, (ROW_NUMBER() OVER (partition by occupation order by name)) as rownumber from occupations 
) 
pivot 
(
    max(name) 
    for occupation 
    in ('Doctor' as d, 'Professor' as p, 'Singer' as s, 'Actor' as a) 
) 
order by rownumber; 

これは上記のクエリが動作する入力テーブルである:

enter image description here

これはあたりとして正しいクエリによって生成された出力を、それ質問:

Jenny Ashley  Meera Jane 
Samantha Christeen Priya Julia 
NULL  Ketty  NULL Maria 

今、私はkにしたいですクエリーによって出力がどのように生成されるか、すなわち実行の流れと共に段階的にどのように生成されるかを示す。上記の状況に合った簡単な例の説明は非常に高く評価されます。前もって感謝します。

+0

誰もがdownvoted、理由を言及してください –

答えて

0

次の句きfrom後:

select name,occupation, (ROW_NUMBER() OVER (partition by occupation order by name))

は、上記の事実上3列に表データを再スタック - 名前、職業、ROWNUMBER。 rownumberは職業の列が変わるとすぐにリセットされます。

ピボット機能を使用すると、集計結果&が列に行を回転させてみましょう

NAME     OCCUPATION   ROWNUMBER 
-------------------- -------------------- ---------- 
Jane     ACTOR    1 
Julia    ACTOR    2 
Maria    ACTOR    3 
JENNY    DOCTOR    1 <-- rownumber reset to 1 
Sammantha   DOCTOR    2 
:出力データは次のようになります。 ピボット使用コードです:

PIVOT 
(
    aggregate_function(column2) 
    FOR column2 
    IN (expr1, expr2, ... expr_n) | subquery 
) 

だからあなたPIVOT機能がOCCUPATIONに基づいNAMEを名前を積み重ねてきました。各スタック(出力の列)は、最初のサブクエリを介して挿入されたrownumber columnによって順序付けられます。

+0

あなたの時間をありがとうが、私は自分自身がこれを多く知っている、私が欲しいのは、ピボットが分割された行をどのように働いているかです。どのようにSQLの流れです。何が最初に実行され、次に何が実行されますか?答えがどのように詳細なステップで来るのかを私に説明することができれば幸いです。 –

+0

@ ShivamArora - 実行の順序は、Abhishekがそれを記述したのとまったく同じです。サブクエリがあるので、最初に実行されます。結果は、この回答に記載されている「出力」です.3つの列(名前、職業、rownumber)です。この出力はPIVOT操作への入力になります。サブクエリで作成された3つの列が無関係になる(PIVOT操作はわからず、認識できず、3番目の列が作成されたことを知る必要もありませんROW_NUMBER関数を使用して)。 – mathguy

+0

@mathguy:クエリから '(ROW_NUMBER()OVER(名前で職業順によるパーティション))rownumber'を削除すると、あなたの答えはどうなりますか? –

関連する問題