当前位置: 代码迷 >> Sql Server >> 辛苦了半晌,总算把sql语句拼完了,但总觉得是不是应该不用这么难的
  详细解决方案

辛苦了半晌,总算把sql语句拼完了,但总觉得是不是应该不用这么难的

热度:84   发布时间:2016-04-24 10:06:57.0
辛苦了半天,总算把sql语句拼完了,但总觉得是不是应该不用这么难的?

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 #这些,可以不写
  相关解决方案