日期:2014-05-16  浏览次数:20442 次

sql统计问题,新手求指教啊

------解决方案--------------------

create table test1(id int,部门 varchar(10),任务 varchar(10),计划完成时间 datetime)
insert test1 
select 1,'部门1','任务1','2014-04-22' union all
select 2,'部门2','任务2','2014-04-26' union all
select 3,'部门1','任务3','2014-04-21' union all
select 4,'部门2','任务4','2014-04-20' 
create table test2(id int,任务 varchar(10),实际完成时间 datetime)
insert test2 
select 1,'任务1','2014-04-21' union all
select 2,'任务2','2014-04-22' union all
select 3,'任务3','2014-04-23' union all
select 4,'任务4','2014-04-14' 

select a.部门,
完成率=CAST(SUM(case when a.计划完成时间>=b.实际完成时间 then 1 else 0 end)*100/COUNT(*) as varchar)+'%'
from test1 a
inner join test2 b
on a.任务=b.任务
group by a.部门
/*
部门1 50%
部门2 100%
*/

------解决方案--------------------

select a.部门, b.完成任务数量 / a.任务数量 as 完成率 from
(select 部门,COUNT(0) AS 任务数量 from 表1 group by 部门) a,
(select 表1.部门, COUNT(0) AS 完成任务数量 from 表1, 表2
 where 表1.任务 = 表2.任务
   and 表1.计划完成时间 >= 表2.实际完成时间
group by 表1.部门) b
where a.部门 = b.部门

------解决方案--------------------

--> 测试数据:[a]  
if object_id('[a]') is not null drop table [a]  
go   
create table [a]([ID] int,[部门] varchar(6),[任务] varchar(6),[计划完成时间] datetime)  
insert [a]  
select 1, '部门1','任务1','2014/4/22' union all  
select 2, '部门2','任务2','2014/4/26' union all  
select 3, '部门1','任务3','2014/4/21' union all  
select 4, '部门2','任务4','2014/4/20' 

--> 测试数据:[b]  
if object_id('[b]') is not null drop table [b]  
go   
create table [b]([ID] int,[任务] varchar(6),[实际完成时间] datetime)  
insert [b]  
select 1,'任务1','2014/4/21' union all  
select 2,'任务2','2014/4/22' union all  
select 3,'任务3','2014/4/23' union all  
select 4,'任务4','2014/4/14' 

--查询语句
select a.部门,cast(cast(sum(case when a.计划完成时间>=a.实际完成时间 then 1 else 0 end) as float)/(count(a.部门))*100 as varchar(10))+'%' as '完成率' 
from
(
select a.*,b.实际完成时间 from a a left join b b on a.[任务]=b.[任务]
) a 
group by  a.部门\

--结果
/*
部门     完成率
------ -----------
部门1    50%
部门2    100%

(2 行受影响)

*/