当前位置: 代码迷 >> Sql Server >> 怎么在存储过程中把合计置顶
  详细解决方案

怎么在存储过程中把合计置顶

热度:10   发布时间:2016-04-24 09:23:09.0
如何在存储过程中把合计置顶
原来的代码如下:



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
  相关解决方案