2016-05-16 112 views
0

我有4列如何计算在SQL Server百分比2008

  • 局的查询,
  • T1为谁了课程
  • T2的数量董事会下的员工数量课程,该分局采取
  • T3每个首长

我想补充那花费的总奖金,每局的总奖金的比例

其计算公式为(t3/total sum of t3) * 100

这是查询:

with cte1 as 
(
    select 
     vwemployee.directorateName, 
     count(distinct vwemployeeCourse.employeeId) as t1 
    from 
     vwemployee, vwemployeeCourse 
    where 
     vwemployee.directorateName = vwemployeeCourse.directorateName 
    group by  
     vwemployee.directorateName 
), cte2 as 
(
    select 
     vwemployee.directorateName, 
     count(vwemployee.directorateName) as t2 
    from 
     vwemployee, employeeCourse 
    where 
     vwemployee.Id = employeeCourse.employeeId 
    group by 
     vwemployee.directorateName 
), cte3 as 
(
    select 
     vwemployeeCourse.directorateName, 
     sum(vwCourse.cost) as t3 
    from 
     vwemployeeCourse, vwCourse 
    where 
     vwemployeeCourse.courseId = vwCourse.Id 
    group by 
     vwemployeeCourse.directorateName 
) 
select 
    cte1.directorateName, cte1.t1, cte2.t2, cte3.t3 
from 
    cte1 
inner join 
    cte2 on cte1.directorateName = cte2.directorateName 
inner join 
    cte3 on cte2.directorateName = cte3.directorateName 

到目前为止,我已经学会了如何查询组合在一起,但我想学习如何使用上面的操作。

+1

[踢坏的习惯:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx ) - 在ANSI - ** 92 ** SQL标准中,旧式*逗号分隔的表*样式列表被替换为* proper * ANSI'JOIN'语法(** mor并且它的使用不受欢迎 –

+0

每次我使用join时,我都会得到错误的输出结果,但是如果可以的话,你可以自由地重新设计查询,并且告诉我,因为我是一周的SQL初学者。 –

回答

0

您可以使用窗口类函数:

with . . . 
select cte1.directorateName, cte1.t1, cte2.t2, cte3.t3, 
     cte3.t3/sum(cte3.t3) over() 
from cte1 inner join 
    cte2 
    on cte1.directorateName = cte2.directorateName inner join 
    cte3 
    on cte2.directorateName = cte3.directorateName; 

如果t3是一个整数,那么你需要将其转换为数字带小数点(SQL Server执行整数除法):

with . . . 
select cte1.directorateName, cte1.t1, cte2.t2, cte3.t3, 
     cte3.t3*100.0/sum(cte3.t3) over() 
from cte1 inner join 
    cte2 
    on cte1.directorateName = cte2.directorateName inner join 
    cte3 
    on cte2.directorateName = cte3.directorateName; 
+0

是的第二个查询工作,但你忘了把它乘以100,但我没有添加它谢谢你<3 –