Я думаю, вы можете просто добавить зарплату в свой подзапрос "hours_per_month" следующим образом:
select "Staff_Id",
extract(year from "Date")::int as work_year,
extract(month from "Date")::int as work_month,
sum(hours::interval) work_hours,
trunc (extract (epoch from sum(hours::interval)) / 3600) * 150 as salary
from hours
where hours is not null
group by "Staff_Id", work_year, work_month
Это предполагает, что вы хотите платить целые часы (15,8 часа = 15 часов оплаты), но если нет, это достаточно легко настроить.
extract (hours
может также работать, но не в том случае, если общее количество часов> 24. По моему мнению, не стоит предполагать, что это произойдет, даже в таком случае, когда было бы нереалистично предполагать, что человек будет работать более 24 часов за один раз. Кроме того, позже вы можете невольно клонировать этот код, чтобы он работал для чего-то вроде «машинных часов», и в этом случае это было бы очень возможно.
Тогда в вашем основном запросе:
select "Staff_Id",
work_year,
sum("work_hours") filter (where work_month = 1) as jan,
sum(salary) filter (where work_month = 1) as jan_salary,
sum("work_hours") filter (where work_month = 2) as feb,
sum(salary) filter (where work_month = 2) as feb_salary,
...
sum("work_hours") filter (where work_month = 12) as dec,
sum(salary) filter (where work_month = 12) as dec_salary
from hours_per_month
group by "Staff_Id", work_year
Абсолютно не по теме, и я не пытаюсь рассказать вам, как прожить свою жизнь, но когда я вижу кавычки вокруг имен полей и таблиц, нет, это на самом последнем шаге запроса (рендеринг вывода), который он делает моя кожа ползет. Это также вводит так много шансов на ошибки. Как это бывает, я не одинок на мой взгляд:
https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_upper_case_table_or_column_names