2017-05-26 54 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。 –