Я предполагаю, что ваша hire_date - это varchar2, поскольку в вашем примере вы делаете предложение "like".
Подойдет ли простая таблица с одной строкой в год?
ЕслиИтак, попробуйте это в Oracle:
select case grouping(hire_date)
when 0 then hire_date
else 'TOTAL'
end hire_date,
count(hire_date) as count_hire_date
from employees
group by rollup(hire_date);
Это должно дать что-то вроде:
hire_date count_hire_date
1995 10
1996 20
1997 30
TOTAL 60
Если вам нужно превратить ваши результаты во что-то, что вы показали в своем вопросе,тогда вы можете сделать следующее, если вы знаете определенный набор лет до выполнения запроса.Так, например, если вы знали, что в вашей таблице только 1995, 1996 и 1997 годы, то вы можете изменить результаты, используя это:
SELECT
MAX(CASE WHEN hire_date = 'TOTAL' THEN ilv.count_hire_date END) total,
MAX(CASE WHEN hire_date = '1995' THEN ilv.count_hire_date END) count_1995,
MAX(CASE WHEN hire_date = '1996' THEN ilv.count_hire_date END) count_1996,
MAX(CASE WHEN hire_date = '1997' THEN ilv.count_hire_date END) count_1997
from (
select case grouping(hire_date)
when 0 then hire_date
else 'TOTAL'
end hire_date,
count(hire_date) as count_hire_date
from employees
group by rollup(hire_date)
) ilv;
Это имеет очевидный недостаток: вам нужно добавить новыйпредложение в основной оператор выбора для каждого возможного года.