2017-05-26 59 views
1

在我上一篇文章(下面的鏈接)中,我試過使用ROW_NUMBER ORDER BY並最終得到了所需的解決方案。請參閱以下鏈接:而不是ROW_NUMBER ORDER

Get Wages Yearly Increment Column Wise Using Sql

現在我嘗試使用下面的查詢SQL Server 2000中,只是爲了演示的目的。我知道,ROW_NUMBER ORDER BY不能用於它。而一些谷歌上搜索後,試圖使用SQL Server 2000中的以下內容:(1查詢)

SELECT k.ID, k.[Name], m.Amt, 
    (SELECT COUNT(*) FROM EmpIncrement l WHERE l.EmpID <= m.EmpID) as RowNum 
    FROM EmpIncrement m 
JOIN Employee k ON m.EmpID = k.ID 

而且我得到了這樣的輸出:

ID Name Amt  RowNum 
1 John 2000 2 
2 Jack 8000 4 
1 John 1000 2 
2 Jack 4000 4 

同樣,當我用ROW_NUMBER ORDER BY以下,那麼它示出了不同的輸出:(第二查詢)

SELECT k.ID, k.Name, m.Amt, 
     ROW_NUMBER() OVER (PARTITION BY EmpID ORDER BY DATEPART(yy,IncrementDate)) as RowNum 
    FROM EmpIncrement m 
JOIN Employee k ON k.ID = m.EmpID 

輸出:

ID Name Amt  RowNum 
1 John 1000 1 
2 John 2000 2 
1 Jack 4000 1 
2 Jack 8000 2 

因此,注意到在第二個查詢的輸出正確的兩個查詢中,員工ID(RowNum)的分組都不相同。我想知道兩個查詢輸出的差異以及第一個查詢是否等於ROW_NUMBER ORDER BY。謝謝。

注:我沒有在這裏再次包含表結構和示例數據。沒關係 - 你可以看到之前的文章。

回答

1

要重新創建partition by EmpId,您的子查詢應該有l.EmpId = m.Empid。您確實需要一個唯一的列或一組列來唯一標識此版本的行才能正常工作。在基於給定數據的嘗試中,如果EmpId, Amt是唯一對,則可以使用and l.Amt < m.Amt。如果你在桌上有代理id,那會更好,而不是Amt

select 
    k.id 
    , k.[Name] 
    , m.Amt 
    , (select count(*) 
     from EmpIncrement l 
     where l.Empid = m.Empid 
     and l.Amt <= m.Amt 
) as RowNum 
from EmpIncrement m 
    inner join Employee k 
    on m.Empid = k.id 

如果你沒有一組列來唯一標識的行排序,您可以使用臨時表與identity()列。

create table #temp (tmpid int identity(1,1) not null, id int, [Name] varchar(32), Amt int); 
insert into #temp (id, [Name], Amt); 
select 
    k.id 
    , k.[Name] 
    , m.Amt 
from EmpIncrement m 
    inner join Employee k 
    on m.Empid = k.id; 

select 
    t.id 
    , t.[Name] 
    , t.Amt 
    , (select count(*) 
      from #Temp i 
      where i.Empid = t.Empid 
      and i.tmpId <= t.tmpId 
    ) as RowNum 
from #temp t 
+0

我想,用'Generic'這個詞,你問的是表中唯一的id,如果是的話,它是包含的。謝謝你的回答@SqlZim。 –

+0

@ AT-2017我應該使用'surrogate'這個詞,我會糾正這個問題。 – SqlZim

+0

它的工作,我只是稍微改變這一節'哪裏l.Empid = m.Empid和l.Amt <= m.Amt'到這個'where l.Empid = m.Empid和l.IncrementID> = m.IncrementID' (在第一個查詢中),因爲我在** EmpIncrement **表中擁有唯一的ID。非常感謝@SqlZim。 –