日期:2014-05-18 浏览次数:20694 次
create table tb(id int,number int,value int,flag varchar(10)) insert into tb values(1 ,1 ,10 ,'A') insert into tb values(2 ,1 ,10 ,'A') insert into tb values(3 ,1 ,10 ,'B') insert into tb values(4 ,1 ,10 ,'C') insert into tb values(5 ,2 ,20 ,'A') insert into tb values(6 ,3 ,50 ,'A') insert into tb values(7 ,3 ,50 ,'A') insert into tb values(8 ,4 ,20 ,'B') insert into tb values(9 ,5 ,10 ,'A') go select flag , (select count(1) from tb where flag = t.flag) flagCount, sum(value) valueSum from ( select distinct number , value , flag from tb ) t group by flag drop table tb /* flag flagCount valueSum ---------- ----------- ----------- A 6 90 B 2 30 C 1 10 (所影响的行数为 3 行) */
------解决方案--------------------
create table sup (id int, number int, value int, flag char(1)) insert into sup select 1, 1, 10, 'A' union all select 2, 1, 10, 'A' union all select 3, 1, 10, 'B' union all select 4, 1, 10, 'C' union all select 5, 2, 20, 'A' union all select 6, 3, 50, 'A' union all select 7, 3, 50, 'A' union all select 8, 4, 20, 'B' union all select 9, 5, 10, 'A' select a.flag,a.flagCount,b.valueSum from (select t1.flag,count(*) 'flagCount' from sup t1 group by t1.flag) a cross apply ((select sum(value) 'valueSum' from (select distinct flag,number,value from sup) t2 where t2.flag=a.flag)) b flag flagCount valueSum ---- ----------- ----------- A 6 90 B 2 30 C 1 10
------解决方案--------------------
declare @T table (id int,number int,value int,flag varchar(1)) insert into @T select 1,1,10,'A' union all select 2,1,10,'A' union all select 3,1,10,'B' union all select 4,1,10,'C' union all select 5,2,20,'A' union all select 6,3,50,'A' union all select 7,3,50,'A' union all select 8,4,20,'B' union all select 9,5,10,'A' select flag, (select count(1) from @T where flag=a.flag) as flagCount , sum(value) as valueSum from (select distinct number,value,flag from @T)a group by flag /* flag flagCount valueSum ---- ----------- ----------- A 6 90 B 2 30 C 1 10 */
------解决方案--------------------
select a.flag,a.flagCount,sum(b.value) as valueSum from (select flag,count(1) as flagCount from tb group by flag) a join (select distinct number,value,flag from tb) b on a.flag=b.flag group by a.flag,a.flagCount /** flag flagCount valueSum ---------- ----------- ----------- A 6 90 B 2 30 C 1 10 (3 行受影响) **/