2017-07-08 11 views
1

は、Employeeテーブルを考えてみて、年間最高シーケンス番号、パーSSNのための税額の合計をピックアップする必要があります:ごとの雇用

Employerid ssn year Seqnumber  q1taxamt q2taxamt  q3taxamt  q4taxamt 
1004  101 2013 1    2000  0   0    0 
1004  101 2013 2    2000  100   0    0 
1004  101 2013 3    2000  100   200   0 
1004  101 2013 4    2000  100   200   300 
1004  102 2013 1    3000  0   0    0 
1004  102 2013 2    3000  200   0    0 
1004  102 2013 3    3000  200   300   0 
1004  102 2013 4    3000  200   300   400 
1004  102 2013 5    3000  200   300   400 

ここで変換規則は、私たちが尊敬と最も高いSeqnumberを選択する必要があります毎年各ssnに
従業員とその額。合計10004のため

すなわち(q1taxamt)2000 +3000 = 5000

ロジック101 SSNである4とSSN 102の最高SEQ番号は、我々はこれらの値のWRTを選択する必要があるので、5の最もSEQ番号を有していますemployeridする

例: はq1taxamtをチェックしたい:3000 = 5000

がq4taxamtをチェックする2000年:300 400 = 700

出力がなければなりません。

Employerid YEAR  q1taxamt q2taxamt  q3taxamt  q4taxamt  
10004  2013  5000  300   500   700 

以下のクエリが間違った結果を生成している:

Select 
    Sum(E1.q1taxamt) q1taxamt, 
    Sum(E1.q2taxamt) q2taxamt, 
    Sum(E1.q3taxamt) q3taxamt, 
    Sum(E1.q4taxamt) q4taxamt, 
    E1.Employerid, 
    E1.YEAR 
from Employee E1 
join 
(
    select 
     E.Employerid, 
     MAX(E.seqnumber) seqnumber, 
     E.YEAR 
    from Employee E 
    group by E.Employerid,E.SSn,E.year 
)E2 
on E1.Employerid=E2.Employerid 
AND E1.YEAR=E2.YEAR 
and E1.seqnumber=E2.Taxseqnumber 

答えて

2

だけrow_number()を使用します。

select e.* 
from (select e.*, 
      row_number() over (partition by E.Employerid, E.SSn, E.year 
           order by e.seqnumber desc 
           ) as seqnum 
     from Employee e 
    ) e 
where seqnum = 1; 

最高のパフォーマンスを得るために、あなたはEmployee(EmployerId, SSN, seqnumber desc)にインデックスをしたいです。

+0

実行に長時間かかっても、他のパフォーマンスに関するヒントはありますか –

0

あなたが不足していますSSNE1E2の間で述語を結合すると、結果が間違っています。私はこれがRow_Numberの方法より高速かもしれないと思う。

Select 
    Sum(E1.q1taxamt) q1taxamt, 
    Sum(E1.q2taxamt) q2taxamt, 
    Sum(E1.q3taxamt) q3taxamt, 
    Sum(E1.q4taxamt) q4taxamt, 
    E1.Employerid, 
    E1.YEAR 
from Employee E1 
join 
(
    select 
     E.Employerid, 
     E.SSn, 
     MAX(E.seqnumber) seqnumber, 
     E.YEAR 
    from Employee E 
    group by E.Employerid,E.SSn,E.year 
)E2 
on E1.Employerid=E2.Employerid 
AND E1.YEAR=E2.YEAR 
AND E1.SSN = E2.SSN --Here 
and E1.seqnumber=E2.Taxseqnumber 
関連する問題