2016-05-16 4 views
0

У меня есть запрос из 4-х колонкаКак рассчитать процент в SQL Server 2008

  • директората,
  • t1 для числа сотрудников под дирекцией, которые принимали курсы
  • t2 для численности курсы, директорат принял
  • t3 на общий приз, который проводит в каждой дирекции

Я хочу, чтобы добавить t4 за процент от общего выигрыша каждой дирекции

Формула (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 'JOIN' синтаксис в ANSI - ** 92 ** SQL Standard (** mor менее 20 лет ** назад), и его использование не рекомендуется –

+0

каждый раз, когда я использую соединение, я получаю неправильный вывод, но вы можете перепроектировать запрос, если можете, и показать мне, как я начинаю с нуля на SQL. –

ответ

0

Вы можете использовать окно fucntions:

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 –

Смежные вопросы