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

ruhong 2014-07-14 11:14:09

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_个人平均


请各位一眼看过去,看看最大的问题在哪里?应该怎么改进?
来回生成了很多临时表,可是不用临时表,根本就没有办法完成啊,他的逻辑太复杂了。
...全文
194 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
--小F-- 2014-07-15
  • 打赏
  • 举报
回复
关键是你要实现什么逻辑?不然直接是SQL帝
Andy-W 2014-07-15
  • 打赏
  • 举报
回复
引用 楼主 ruhong 的回复:

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_个人平均
请各位一眼看过去,看看最大的问题在哪里?应该怎么改进? 来回生成了很多临时表,可是不用临时表,根本就没有办法完成啊,他的逻辑太复杂了。
太強悍了
發糞塗牆 2014-07-15
  • 打赏
  • 举报
回复
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 #这些,可以不写

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧