Кажется, что в вашей модели данных отсутствуют таблица отделов и таблица организации. Вы должны, вероятно, создать их. Ну, CTE (WITH
предложение) пока подойдет ...
with dept as
(
select 'P1' as id, 'Trolley P1' as name from dual union all
select 'P2' as id, 'Trolley P2' as name from dual union all
select 'P3' as id, 'Trolley P3' as name from dual union all
select 'P4' as id, 'Trolley P4' as name from dual union all
select 'P4' as id, 'Trolley P5' as name from dual union all
select 'P6' as id, 'Trolley P6' as name from dual
)
, org as
(
select 1010 as code, 'P1' as dept_id from dual union all
select 1011 as code, 'P2' as dept_id from dual union all
select 1053 as code, 'P3' as dept_id from dual union all
select 1054 as code, 'P4' as dept_id from dual union all
select 1057 as code, 'P4' as dept_id from dual union all
select 1040 as code, 'P5' as dept_id from dual union all
select 1047 as code, 'P5' as dept_id from dual union all
select 1063 as code, 'P6' as dept_id from dual union all
select 1064 as code, 'P6' as dept_id from dual union all
select 1065 as code, 'P6' as dept_id from dual union all
select 1068 as code, 'P6' as dept_id from dual
)
select
dept.name as department,
sum(case when tpa.wage_code = 'SICK' then wage_hours end) as hours_sick,
sum(case when tpa.wage_grp_db in ('O', 'N') then wage_hours end) as hours_present,
to_char(account_date, 'yyyy-mm') as month
from trolleyparkattendant tpa
join org on org.code = tpa.org_code
join dept on dept.id = org.dept_id
group by dept.name, to_char(account_date, 'yyyy-mm')
order by month, department;
Я взял wage_grp_db in ('O', 'N')
и wage_code = 'SICK'
, чтобы быть взаимоисключающими. Ваше WHERE
предложение вроде бы подсказало это. Возможно, вам придется принять это, если это не так.
Если вы тоже хотите посчитать записи, не относящиеся к отделам, тогда вместо этого введите left outer join dept
.