你试试看看行不行 with t as( select 1 SupplyID,'D_1' SupplyDeptID union all select 2 SupplyID,'D_2' SupplyDeptID union all select 3 SupplyID,'D_2' SupplyDeptID union all select 4 SupplyID,'D_2' SupplyDeptID union all select 5 SupplyID,'D_2' SupplyDeptID union all select 6 SupplyID,'D_2' SupplyDeptID union all select 7 SupplyID,'D_2' SupplyDeptID union all select 8 SupplyID,'D_2' SupplyDeptID union all select 9 SupplyID,'D_2' SupplyDeptID union all select 10 SupplyID,'D_2' SupplyDeptID union all select 11 SupplyID,'D_2' SupplyDeptID union all select 12 SupplyID,'D_2' SupplyDeptID union all select 13 SupplyID,'D_2' SupplyDeptID union all select 14 SupplyID,'D_2' SupplyDeptID union all select 15 SupplyID,'D_3' SupplyDeptID union all select 16 SupplyID,'D_3' SupplyDeptID ) , t1(groupid,SupplyID,SupplyDeptID) as( select ROW_NUMBER()over(partition by supplydeptid order by supplydeptid)/(10+1),*from t ), t2 (SupplyDeptID,groupid,minsupplyid,maxsupplyid) as( select SupplyDeptID,groupid ,MIN(SupplyID),MAX(SupplyID) from t1 group by SupplyDeptID,groupid ) ,t3 as( select ROW_NUMBER()over(order by supplydeptid)gp,* from t2 ) select right(('000'+cast(gp as varchar)),3)flowid, t1.SupplyID,t1.SupplyDeptID from t1 left join t3 on t1.supplydeptid=t3.supplydeptid and t1.supplyid between t3.minsupplyid and t3.maxsupplyid
我用的是SQL2000,用不了ROW_NUMBER()函数~哇……
SQL Server 2000 -- 先把数据灌到一个临时表中,利用 IDENTITY 函数,生成一个自增列, 再加工这个自增列。 -- 下面是个例子。select name , object_id , IDENTITY(int,1,1) id into aa from sysobjects where xtype ='u' go select * from aa go
SELECT RIGHT('000'+CONVERT(varchar(3), (SELECT ISNULL(SUM(C),0)+1 FROM ( -- 比当前 SupplyDeptID 小的分组数 SELECT SupplyDeptID, (COUNT(*)+9)/10 C FROM T t0 WHERE t0.SupplyDeptID < T.SupplyDeptID GROUP BY SupplyDeptID UNION ALL -- SupplyDeptID 相同,比当前 SupplyID 小的分组数 SELECT SupplyDeptID, COUNT(*)/10 C FROM T t1 WHERE t1.SupplyDeptID = T.SupplyDeptID AND t1.SupplyID < T.SupplyID GROUP BY SupplyDeptID ) TX )), 3) FlowID, T.SupplyID, T.SupplyDeptID FROM /* 代入你原先的查询(要求 SupplyID 为 int 型) */ T FlowID SupplyID SupplyDeptID ------ ----------- ------------ 001 1 D_1 002 2 D_2 002 3 D_2 002 4 D_2 002 5 D_2 002 6 D_2 002 7 D_2 002 8 D_2 002 9 D_2 002 10 D_2 002 11 D_2 003 12 D_2 003 13 D_2 003 14 D_2 004 15 D_3 004 16 D_3
with t as(
select 1 SupplyID,'D_1' SupplyDeptID union all
select 2 SupplyID,'D_2' SupplyDeptID union all
select 3 SupplyID,'D_2' SupplyDeptID union all
select 4 SupplyID,'D_2' SupplyDeptID union all
select 5 SupplyID,'D_2' SupplyDeptID union all
select 6 SupplyID,'D_2' SupplyDeptID union all
select 7 SupplyID,'D_2' SupplyDeptID union all
select 8 SupplyID,'D_2' SupplyDeptID union all
select 9 SupplyID,'D_2' SupplyDeptID union all
select 10 SupplyID,'D_2' SupplyDeptID union all
select 11 SupplyID,'D_2' SupplyDeptID union all
select 12 SupplyID,'D_2' SupplyDeptID union all
select 13 SupplyID,'D_2' SupplyDeptID union all
select 14 SupplyID,'D_2' SupplyDeptID union all
select 15 SupplyID,'D_3' SupplyDeptID union all
select 16 SupplyID,'D_3' SupplyDeptID ) ,
t1(groupid,SupplyID,SupplyDeptID) as(
select ROW_NUMBER()over(partition by supplydeptid order by supplydeptid)/(10+1),*from t ),
t2 (SupplyDeptID,groupid,minsupplyid,maxsupplyid) as(
select SupplyDeptID,groupid ,MIN(SupplyID),MAX(SupplyID) from t1 group by SupplyDeptID,groupid )
,t3 as(
select ROW_NUMBER()over(order by supplydeptid)gp,* from t2
)
select right(('000'+cast(gp as varchar)),3)flowid,
t1.SupplyID,t1.SupplyDeptID from t1 left join t3 on t1.supplydeptid=t3.supplydeptid
and t1.supplyid between t3.minsupplyid and t3.maxsupplyid
-- 下面是个例子。select name , object_id , IDENTITY(int,1,1) id into aa from sysobjects where xtype ='u'
go
select * from aa
go
(SELECT ISNULL(SUM(C),0)+1
FROM (
-- 比当前 SupplyDeptID 小的分组数
SELECT SupplyDeptID,
(COUNT(*)+9)/10 C
FROM T t0
WHERE t0.SupplyDeptID < T.SupplyDeptID
GROUP BY SupplyDeptID
UNION ALL
-- SupplyDeptID 相同,比当前 SupplyID 小的分组数
SELECT SupplyDeptID,
COUNT(*)/10 C
FROM T t1
WHERE t1.SupplyDeptID = T.SupplyDeptID
AND t1.SupplyID < T.SupplyID
GROUP BY SupplyDeptID
) TX
)),
3) FlowID,
T.SupplyID,
T.SupplyDeptID
FROM /* 代入你原先的查询(要求 SupplyID 为 int 型) */ T
FlowID SupplyID SupplyDeptID
------ ----------- ------------
001 1 D_1
002 2 D_2
002 3 D_2
002 4 D_2
002 5 D_2
002 6 D_2
002 7 D_2
002 8 D_2
002 9 D_2
002 10 D_2
002 11 D_2
003 12 D_2
003 13 D_2
003 14 D_2
004 15 D_3
004 16 D_3