показ столбцов в определенном шаблоне в postgresql - PullRequest
0 голосов
/ 19 января 2019

Я написал запрос, который возвращает таблицу, показывающую общее месячное рабочее время каждого сотрудника в компании.поэтому результат:

name*****jan************feb**********march ......... dec
Tom     170:24:31    186:27:09    140:00:00........158:17:56     

мне нужен запрос, который дает следующий вывод:

name***jan***jan_salary****feb***feb_salary***....***dec***dec_salary      

зарплата за каждый месяц - это общее количество рабочих часов за этот месяц, умноженное на 150 $,Как я могу это сделать?Ниже приведен запрос, который я написал для расчета общего рабочего времени каждого человека за каждый месяц:

with hours as (
  select "Staff_Id", 
     "Date", 
     case 
       when row_number() over w % 2 = 0 then 
          TO_CHAR("Time" - lag("Time") over w,'HH24:MI:SS')
     end as hours
  from "Org"."Clock"
  window w as (partition by "Staff_Id", "Date" order by "Time")
), hours_per_month as (
  select "Staff_Id", 
     extract(year from "Date")::int as work_year,
     extract(month from "Date")::int as work_month,
     sum(hours::interval) work_hours
  from hours
  where hours is not null
  group by "Staff_Id", work_year, work_month
)
select "Staff_Id", 
   work_year,
   sum("work_hours") filter (where work_month = 1) as jan,
   sum("work_hours") filter (where work_month = 2) as feb,
   sum("work_hours") filter (where work_month = 3) as march,
   sum("work_hours") filter (where work_month = 4) as april,
   sum("work_hours") filter (where work_month = 5) as may,
   sum("work_hours") filter (where work_month = 6) as june,
   sum("work_hours") filter (where work_month = 7) as july,
   sum("work_hours") filter (where work_month = 8) as aug,
   sum("work_hours") filter (where work_month = 9) as sep,
   sum("work_hours") filter (where work_month = 10) as oct,
   sum("work_hours") filter (where work_month = 11) as nov,
   sum("work_hours") filter (where work_month = 12) as dec
from hours_per_month  
group by "Staff_Id", work_year

1 Ответ

0 голосов
/ 20 января 2019

Я думаю, вы можете просто добавить зарплату в свой подзапрос "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

...