日期:2014-05-18  浏览次数:20543 次

SQS Server 分组汇总
有数据表Table,有字段 Debt(部门)、Duty(职务,值为高工、工程师、助工之一),表中有如下数据: 
  Debt(部门) Duty(职务) 
  设计室1 高工 
  设计室2 助工 
  设计室2 高工 
  设计室1 工程师  
希望首先按Debt分组汇总记录数,同时在每一分组内,再按Duty分组汇总记录数,结果集是: 
  部门 总计 高工 工程师 助工 
  设计室1 2 1 1 0  
  设计室2 2 1 0 1  
SQL语句是怎样的?  


------解决方案--------------------
--静态SQL,指duty只有这高工、工程师、助工三个值
select debt , count(*) 总计,
sum(case duty when '高工' then 1 else 0 end) '高工',
sum(case duty when '工程师' then 1 else 0 end) '工程师',
sum(case duty when '助工' then 1 else 0 end) '助工'
from table
group by debt

------解决方案--------------------
declare @sql varchar(1000)
select @sql=''
select @sql=@sql+','+duty+'=sum(case when duty='''+duty+''' then 1 else 0 end)'
from #t group by duty


exec('select Debt,scount=count(*)'+@sql+' from #t group by Debt')
------解决方案--------------------
declare @t Table (Dept varchar(10),Duty varchar(10))
insert into @t select '设计室1','高工' 
union all select '设计室2','助工'
union all select '设计室2','高工'
union all select '设计室1','工程师'
select b.dept,sum(b.总计) 总计,sum(b.高工) 高工,sum(b.工程师) 工程师,sum(b.助工) 助工 from (select a.dept,(a.高工+a.工程师+a.助工) 总计, a.高工,a.工程师,a.助工 
from ( select dept,case duty when '高工' then 1 else 0 end 高工, 
case duty when '工程师' then 1 else 0 end 工程师,
case duty when '助工' then 1 else 0 end 助工 from @t)a)b group by b.dept