2011-04-17 102 views
1

我试图获得一个连续的行编号,但无论我尝试不工作。这里是我的查询SQL Server 2000行编号

select 
    l.seq, l.mn_no as mn_no, l.sb_no as sb_no, 
    l.dp_no as dp_no, 
    sum(costprice) as amt 
from 
    dbo.mac_pur_tempdetail d 
inner join 
    dbo.mac_pur_tempheader h on d.header_id = h.header_id 
           and h.ref = 'SAH1FIHC' 
inner join 
    dbo.mac_actlocmap l on l.loc_main = d.loc_id 
         and l.description = 'PUR' 
group by 
    l.seq, l.mn_no, l.sb_no, l.dp_no 

下面是该查询的

1 4110  30   0000  17.5000 
4 4110  20   0000  3.6000 
6 4110  40   0000  6.0000 
7 4110  10   0000  1.8000 
14 4110  25   0000  3.6000 
15 4110  50   0000  1.8000 

我试过结果

select 
    (select count(seq) 
    from dbo.mac_actlocmap s 
    where s.seq <= a.seq and a.mn_no = s.mn_no) as new_seq, 
    * 
from 
    (select 
     l.seq, l.mn_no as mn_no, 
     l.sb_no as sb_no, l.dp_no as dp_no, 
     sum(costprice) as amt 
    from 
     dbo.mac_pur_tempdetail d 
    inner join 
     dbo.mac_pur_tempheader h on d.header_id = h.header_id 
            and h.ref = 'SAH1FIHC' 
    inner join 
     dbo.mac_actlocmap l on l.loc_main = d.loc_id 
           and l.description = 'PUR' 
    group by 
     l.seq, l.mn_no, l.sb_no, l.dp_no) a 

但结果是

1 1 4110  30   0000  17.5000 
2 4 4110  20   0000  3.6000 
3 6 4110  40   0000  6.0000 
4 7 4110  10   0000  1.8000 
7 14 4110  25   0000  3.6000 
8 15 4110  50   0000  1.8000 
+0

您是否尝试过使用ROW_NUMBER()?我不确定它是否适用于SQL Server 2000 - http://msdn.microsoft.com/zh-cn/library/ms186734.aspx – 2011-04-17 20:14:48

+1

您的计数正在计算dbo.mac_actlocmap中的* unaggregated *和* unfiltered *行。但是你正在比较一个带有聚合和过滤器的子查询*。 – gbn 2011-04-17 20:15:53

+1

@SeanA:ROW_NUMBER()在SQL Server ** 2005中引入** ** – 2011-04-17 20:21:33

回答

5

你计数计数未聚集未过滤 dbo.mac_actlocmap中的行。但是,您正在比较子查询聚合和过滤器。

由于这种复杂性,请使用临时表。这只比在SQL Server 2000上模拟ROW_NUMBER所需的三角形连接两次完全相同的查询要容易得多

select 
l.seq, 
l.mn_no as mn_no, 
l.sb_no as sb_no, 
l.dp_no as dp_no, 
sum(costprice) as amt 

INTO #foo 

from dbo.mac_pur_tempdetail d 
inner join dbo.mac_pur_tempheader h 
on d.header_id = h.header_id 
and h.ref = 'SAH1FIHC' 
inner join dbo.mac_actlocmap l 
on l.loc_main = d.loc_id 
and l.description = 'PUR' 
group by l.seq,l.mn_no,l.sb_no,l.dp_no 

select 
(select count(seq) from #foo s 
where s.seq <= a.seq and a.mn_no = s.mn_no) as new_seq, 
* from #foo a 
+0

我试图避免临时表......只是认为我在查询中做错了什么......猜测我别无选择。谢谢。 – 2011-04-17 20:22:33