use gysys
declare @关联指标 int
declare @权重分组 nvarchar(4) ='普通员工'
select @关联指标=关联绩效指标 from 绩效管理_任务绩效设置
select a.指标序号,a.指标简码,a.指标名称,b.员工代码,b.姓名 into #dtbl_绩效分类
from (select 指标序号,指标简码,指标名称 from 绩效管理_考核指标 where 级数=1) a
cross join 系统数据_员工信息 b
where b.绩效抽查=1
select a.被考核人,isnull(SUM(a.次数*b.分数),0) as 得分,b.分类所属 into #dtbl_绩效得分
from 绩效管理_考核列表 a
inner join 绩效管理_考核指标 b on a.指标项=b.指标序号
group by a.被考核人,b.分类所属 order by a.被考核人
select * into #dtbl_个人平均 from
(select a.指标名称,a.指标序号,a.员工代码,a.姓名,ISNULL(b.得分,0)+c.权重分数 as 得分
from #dtbl_绩效分类 a
left join #dtbl_绩效得分 b on a.员工代码=b.被考核人 and a.指标简码=b.分类所属
left join 绩效管理_绩效权重 c on c.指标序号=a.指标序号
where c.年份=datepart(year,getdate()) and c.权重分组=@权重分组
union all
select a.指标名称,a.指标序号,a.员工代码,a.姓名,isnull(b.得分,0)+c.权重分数 as 得分
from #dtbl_绩效分类 a
left join (select @关联指标 as 指标序号,被评分人,sum(得分) as 得分
from 绩效管理_任务评分列表 group by 被评分人,得分) b
on a.员工代码=b.被评分人 and a.指标序号=b.指标序号
left join 绩效管理_绩效权重 c on c.指标序号=a.指标序号
where c.年份=datepart(year,getdate()) and c.权重分组=@权重分组
) as a
select a.姓名,a.员工代码,max(case 指标名称 when '行政绩效' then 得分 else 0 end ) as 行政指标,
max(case 指标名称 when '运行绩效' then 得分 else 0 end ) as 运行绩效,
max(case 指标名称 when '技术绩效' then 得分 else 0 end ) as 技术绩效,
max(case 指标名称 when '自管绩效' then 得分 else 0 end ) as 自管绩效,
max(case 指标名称 when '持续绩效' then 得分 else 0 end ) as 持续绩效,
max(case 指标名称 when '评价绩效' then 得分 else 0 end ) as 评价绩效,
max(case 指标名称 when '目标绩效' then 得分 else 0 end ) as 目标绩效,
max(case 指标名称 when '任务绩效' then 得分 else 0 end ) as 任务绩效
from #dtbl_个人平均 a
group by a.姓名,a.员工代码
drop table #dtbl_绩效分类
drop table #dtbl_绩效得分
drop table #dtbl_个人平均
请各位一眼看过去,看看最大的问题在哪里?应该怎么改进?
来回生成了很多临时表,可是不用临时表,根本就没有办法完成啊,他的逻辑太复杂了。
------解决方案--------------------
select a.指标序号,a.指标简码,a.指标名称,b.员工代码,b.姓名 into #dtbl_绩效分类
from (select 指标序号,指标简码,指标名称 from 绩效管理_考核指标 where 级数=1) a
cross join 系统数据_员工信息 b --为什么要cross join?还带有WHERE
where b.绩效抽查=1
下面那段max的貌似直接包到上面就够了,除非你后续还要用到这些临时表,不然没有非常必要频繁使用临时表
另外,drop table #这些,可以不写