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