原来的代码如下:
ALTER PROCEDURE [dbo].[zhixingliShiGong_song] @beginDate datetime,@endDate datetime
AS SET NOCOUNT ON
CREATE TABLE #执行力查询Temp(
人员编号 varchar (50) ,
人员姓名 varchar (50) ,
状态 varchar (100) ,
--总计 numeric(18, 1) default 0 ,
技术方案得分 numeric(18, 1) default 0 ,
市场信息得分 numeric(18, 1) default 0 ,
合计分数 numeric(18, 1) default 0 ,
年计划加分 numeric(18, 1) default 0 ,
年加分百分比 numeric(18, 4) default 0 ,
months numeric(5,2) ,
EntryTime datetime,
edays int,
表演次数 int,
辅导次数 int,
培训次数 int
)
delete from #执行力查询Temp
insert into #执行力查询Temp
(
人员编号
,人员姓名
,技术方案得分
,市场信息得分
,合计分数
,年计划加分,表演次数,辅导次数,培训次数
)
select
a.人员编号
,a.人员姓名
,isnull(a.技术方案得分,0)
,isnull(b.市场信息得分,0)
,0
,isnull(a.年计划加分,0)
,isnull(a.表演次数,0)
,isnull(a.辅导次数,0)
,isnull(a.培训次数,0)
from
(
select 人员编号
,人员姓名
,sum(得分) as 技术方案得分
,年计划加分,表演次数,辅导次数,培训次数
from 执行力得分视图
where 类别='施工' and left(考核编号,1)='3'
and 日期 between @beginDate and @endDate
group by
人员编号
,人员姓名,年计划加分,表演次数,辅导次数,培训次数
) a
left join
(
select 人员编号
,人员姓名
,sum(isnull(得分,0)) as 市场信息得分
,年计划加分,表演次数,辅导次数,培训次数
from 执行力得分视图
where 类别='施工' and left(考核编号,1)='1'
and 日期 between @beginDate and @endDate
group by
人员编号
,人员姓名,年计划加分,表演次数,辅导次数,培训次数
) b
on a.人员编号 =b.人员编号
insert into #执行力查询Temp
(
人员编号
,人员姓名
,技术方案得分
,市场信息得分
,合计分数
)
select distinct 人员编号
,人员姓名
,0
,0
,0
from
(
select
distinct 人员编号
,人员姓名
from 执行力得分视图 a
where not exists (
select 人员编号 from
#执行力查询Temp b
where a.人员编号=b.人员编号
) and 类别='施工' and 执行力是否显示='1'
) a inner join Users b
on a.人员编号=b.UserId
update a
set [状态]=b.[执行力状态]
from #执行力查询Temp as a
inner join [执行力得分] as b on b.[人员编号]=a.[人员编号]
and b.[日期]=(select max(x.[日期])
from [执行力得分] x
where x.[人员编号]=b.[人员编号]
and x.[日期] between @beginDate and @endDate
)
update #执行力查询Temp set months=b.months
,EntryTime=b.entrytime
,edays=b.edays
from #执行力查询Temp a,
(
select userid,userName,entrytime,edays,FLOOR(edays/30)+
case when edays %30 >15 then 1
else 0.5
end as months
from
(
select userid,userName, case YEAR(entrytime)
when YEAR(getdate()) then DATEDIFF(DY,entrytime,getdate())
else DATEDIFF(DY,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0),getdate())
end as edays
,entrytime
from users
) a
) b where a.人员编号=b.userid
update #执行力查询Temp set 合计分数=技术方案得分+市场信息得分
update #执行力查询Temp set 技术方案得分=年计划加分
update #执行力查询Temp set 年加分百分比=合计分数/技术方案得分
where #执行力查询Temp.合计分数!=0
select * from (
select 人员编号,人员姓名,状态
,技术方案得分
,市场信息得分
, 合计分数 as 总计
,年加分百分比
,(cast(round(合计分数/months,4) as numeric(10,2))) as 折算分数
, months as 累计月数
,convert(varchar(10),EntryTime,120) as EntryTime
,edays,表演次数,辅导次数,培训次数
from #执行力查询Temp where 人员编号 is not null
union all
select '','','' ,sum(isnull(技术方案得分,0)),100,sum(isnull(合计分数,0)),0
,sum((cast(round(合计分数/months,4) as numeric(10,2)))),sum(isnull(months,0)),'',sum(isnull(edays,0)),sum(isnull(表演次数,0)),sum(isnull(辅导次数,0)),sum(isnull(培训次数,0))
from #执行力查询Temp
) at
order by at.年加分百分比 asc,at.edays desc,at.总计 asc
drop table #执行力查询Temp
目前是按照年加分百分比排序,而为了加分百分比能够指定因此赋值是0,但是现在要实现加分百分比也要统计平均值,因此合计就跑到中间,请问如何才能既能统计平均值,又能置顶,非常感谢!
------解决思路----------------------
-- 加一个排序列,明细列为 1 as rn , 汇总列 为 0 as rn
select * from (
select 1 as rn , 人员编号,人员姓名,状态
,技术方案得分
,市场信息得分
, 合计分数 as 总计
,年加分百分比
,(cast(round(合计分数/months,4) as numeric(10,2))) as 折算分数
, months as 累计月数
,convert(varchar(10),EntryTime,120) as EntryTime
,edays,表演次数,辅导次数,培训次数
from #执行力查询Temp where 人员编号 is not null
union all
select 0 as rn , '','','' ,sum(isnull(技术方案得分,0)),100,sum(isnull(合计分数,0)),0
,sum((cast(round(合计分数/months,4) as numeric(10,2)))),sum(isnull(months,0)),'',sum(isnull(edays,0)),sum(isnull(表演次数,0)),sum(isnull(辅导次数,0)),sum(isnull(培训次数,0))
from #执行力查询Temp
) at
order by rn , at.年加分百分比 asc,at.edays desc,at.总计 asc