日期:2014-05-18 浏览次数:20528 次
declare @t table ([ID] [int] IDENTITY(1,1) not null, strName varchar(20),intSL int) insert @t select '小明' , 10 union all select '小明' , 20 union all select '小明' , 20 union all select '小红' , 20 union all select '小红' , 20 union all select '小红' , 30 ;with t1 as ( select min([ID]) as ID,strName,sum(intSL) as intSL from @t a group by strName ),t2 as ( select strName,sum(intSL) as intSL2 from ( select row_number() over (partition by strName order by id ) as Row,strName,intSL from @t ) tmp where Row<=2 group by strName ) ,t3 as ( select strName,sum(intSL) as intSL3 from ( select row_number() over (partition by strName order by id ) as Row,strName,intSL from @t where intSL > 10 ) tmp where Row<=2 group by strName ) select row_number() over (order by a.id) as ID,a.strName,a.intSL,b.intSL2,c.intSL3 from t1 a inner join t2 b on a.strName = b.strName inner join t3 c on a.strName = c.strName /* (6 行受影响) ID strName intSL intSL2 intSL3 -------------------- -------------------- ----------- ----------- ----------- 1 小明 50 30 40 2 小红 70 40 40 (2 行受影响) */
------解决方案--------------------
if object_id('[tb]') is not null drop table [tb] go create table [tb] ([ID] [int] IDENTITY(1,1) not null, strName varchar(20),intSL int) insert [tb] select '小明' , 10 union all select '小明' , 20 union all select '小明' , 20 union all select '小红' , 20 union all select '小红' , 20 union all select '小红' , 30 union all select '小东' , 10 go select strname, sum(intSL) as intSL1, sum(case when px<=2 then intSL else 0 end) as intSL2, sum(case when px>2 then intSL else 0 end) as intSL3 from (select px=row_number()over(partition by strname order by getdate()),* from tb)t group by strname /* strname intSL1 intSL2 intSL3 -------------------- ----------- ----------- ----------- 小东 10 10 0 小红 70 40 30 小明 50 30 20 (3 行受影响) */