Граф и процент оценок навыков

У меня есть программа, которая приносит рейтинги умений для оценки людей с названием "Работник", чтобы взять вместе с номером файла, который они назначили. Программа также включает в себя строку отчетности, в которую входит каждый работник.

SELECT distinct 
o.VP,
o.AVP,
o.Director,
o.Supervisor,
o.Worker,
bs.File_NBR,
s.Skill
bs.score
FROM [New_EEs].[dbo].[SBC_Best_Scores] bs
inner join new_ees.dbo.SBC_Skills s
on bs.Skill_NBR=s.SKILL_NBR
inner join gw_PPP.dbo.Org_Hierarchy oon 
bs.File_NBR=o.File_NBR;

Я получаю набор данных, который может выглядеть так:

VP AVP Director Supervisor Worker File_NBR Skill Rating
Gerald Kris Doris NULL Mack 107812 B2 4
Gerald Kris Doris NULL Mack 107812 D1 3
Gerald Kris Doris NULL Mack 107812 D2 3
Gerald Kris Doris NULL Mack 107812 D3 3
Gerald Kris Doris NULL Mack 107812 E1 4
Gerald Kris Mike NULL Brady 109080 A1 5
Gerald Kris Mike NULL Brady 109080 B1 4
Gerald Kris Mike NULL Brady 109080 B2 3
Gerald Kris Mike NULL Brady 109080 B3 4
Gerald Kris Mike NULL Brady 109080 C1 4
Gerald Kris Mike NULL Brady 109080 C2 4
Gerald Kris Mike NULL Brady 109080 C3 0
Kim Harry NULL Grant Tom 108457 B1 4
Kim Harry NULL Grant Tom 108457 B2 4
Kim Harry NULL Grant Tom 108457 C1 4
Kim Harry NULL Grant Tom 108457 C2: 5
Kim Harry NULL Grant Tom 108457 C5 5
Kim Harry NULL Grant Tom 108457 D1 4
Kim Harry NULL Grant Tom 108457 D2 5
Kim Harry NULL Grant Tom 108457 D3 4
Kim Harry NULL Grant Jean 106934 C5 4
Kim Harry NULL Grant Jean 106934 D1 5
Kim Harry NULL Grant Jean 106934 D3 5
Kim Harry NULL Grant Raphe 108901 B2 5
Kim Harry NULL Grant Raphe 108901 C2 5
Kim Harry NULL Grant Raphe 108901 C3 4
Kim Harry NULL Grant Raphe 108901 C5 5
Kim Harry NULL Grant Raphe 108901 D2 5
Kim Harry NULL Grant Raphe 108901 E1 5
Kim Harry NULL Grant Tyika 107923 B1 5
Kim Harry NULL Grant Tyika 107923 B2 5
Kim Harry NULL Grant Tyika 107923 D2 4
Kim Harry NULL Grant Tyika 107923 D3 4

Уровни рейтинга - от 1 до 5. Мне нужно сделать, это создать таблицу, которая показывает количество и процент от каждого рейтинга, предоставляемого рабочим для каждого навыка, сгруппированного по Vp, AVP, Supervisor и Director. Итак, все работы, которые в конечном итоге находятся под AVP и всеми боксерами, которые в конечном счете находятся под режиссером и так далее.

Name Role Skill Count of % of Count of % of 
 Rating 1 Rating 1 Rating 2 Rating 2
Gerald VP A1 100 29% 130 33%
Gerald VP B1 95 28% 95 24%
Gerald VP B2 120 35% 70 18%
Gerald VP B3 30 9% 100 25%
Kim VP A1 
Kim VP B1 
Kim VP B2 and so on 
Kim VP B3 
Kris AVP A1 
Kris AVP B1 
Kris AVP B2 
Kris AVP B3 
Harry AVP A1 
Harry AVP B1 
Harry AVP B2 
Harry AVP B3 
Doris Director A1 
Doris Director B1 
Doris Director B2 
Doris Director B3 
Mike Director A1 
Mike Director B1 
Mike Director B2 
Mike Director B3 
Grant Supervisor A1 
Grant Supervisor B1 
Grant Supervisor B2 
Grant Supervisor B3

Любая помощь была бы замечательной! Благодарю!

1 ответ

Поскольку у вас разные роли в разных столбцах, чтобы получить компактный запрос, вам нужен либо динамический sql, либо сложный стержень. Следовательно, я выбрал только копию и вставку, потому что я не думаю, что сложность стоит 4 ролей, которые у вас есть.

Я назвал ваш запрос T для примера.

with roles as (
 select VP as Name, 'VP' as Role, Skill, Rating from t where VP is not null
 union all 
 select AVP as Name, 'AVP' as Role, Skill, Rating from t where AVP is not null
 union all 
 select Director as Name, 'Director' as Role, Skill, Rating from t where Director is not null
 union all 
 select Supervisor as Name, 'Supervisor' as Role, Skill, Rating from t where Supervisor is not null
), counts as (
 select Name, Role, Skill
 ,count(case when rating = 1 then 1 else NULL end) as [Count of Rating 1]
 ,count(case when rating = 2 then 1 else NULL end) as [Count of Rating 2]
 ,count(case when rating = 3 then 1 else NULL end) as [Count of Rating 3]
 ,count(case when rating = 4 then 1 else NULL end) as [Count of Rating 4]
 ,count(case when rating = 5 then 1 else NULL end) as [Count of Rating 5]
 ,count(*) as TotalCount
 from roles
 group by Name, Role, skill
)
select Name, Role, Skill
,[Count of Rating 1]
,CONVERT(varchar(10), convert(int,100.0 * [Count of Rating 1]/NULLIF(TotalCount, 0))) + '%' as [% of Rating 1]
,[Count of Rating 2]
,CONVERT(varchar(10), convert(int,100.0 * [Count of Rating 2]/NULLIF(TotalCount, 0))) + '%' as [% of Rating 2]
,[Count of Rating 3]
,CONVERT(varchar(10), convert(int,100.0 * [Count of Rating 3]/NULLIF(TotalCount, 0))) + '%' as [% of Rating 3]
,[Count of Rating 4]
,CONVERT(varchar(10), convert(int,100.0 * [Count of Rating 4]/NULLIF(TotalCount, 0))) + '%' as [% of Rating 4]
,[Count of Rating 5]
,CONVERT(varchar(10), convert(int,100.0 * [Count of Rating 5]/NULLIF(TotalCount, 0))) + '%' as [% of Rating 5]
from counts
order by Name, skill

То, что я сделал здесь, - объединить все роли вместе, жестко кодировать имена ролей. roles реорганизуют таблицу, так что каждый, у кого есть VP, получает строку с этим VP, каждый, у кого есть AVP, получает строку с этим AVP,... counts затем подсчитывает всех работников для каждого имени, роли и навыков. Конечный выбор вычисляет проценты.

Здесь скрипка, показывающая это в действии: http://sqlfiddle.com/#!3/fe09d/15

licensed under cc by-sa 3.0 with attribution.