Эта функция использует словарь вторичных цветов и цветов их компонентов и проверяет, является ли набор цветов компонентов подмножеством набора цветов, переданных ему:
secondary_colours = {"green": ("yellow", "blue"),
"purple": ("blue", "red"),
"orange": ("red", "yellow"),
"grey": ("white", "black"),
"beige": ("white", "yellow"),
"brown": ("black", "yellow")}
def obtainable_colours(primary_colours):
"""Returns a list of secondary colours obtainable
from combinations of the primary colours provided.
Assumes additive pigment mixing as defined above."""
global secondary_colours
response = []
for s_col,components in secondary_colours.items():
if set(components) < set(primary_colours):
response.append(s_col)
return response
Тест:
p1 = ['white','black','yellow']
p2 = ['yellow','white','black','red']
p3 = ['blue','yellow','red']
p4 = ['white','red','blue']
for p in [p1,p2,p3,p4]:
print(p)
print(obtainable_colours(p))
print("\n")
>>>
['white', 'black', 'yellow']
['grey', 'beige', 'brown']
['yellow', 'white', 'black', 'red']
['orange', 'grey', 'beige', 'brown']
['blue', 'yellow', 'red']
['green', 'purple', 'orange']
['white', 'red', 'blue']
['purple']
Я думаю, вы можете просто добавить зарплату в свой подзапрос «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
Совершенно не по теме, и я не пытаюсь рассказать вам, как прожить свою жизнь, но когда я вижу кавычки вокруг имен полей и таблиц, unelss это на самом последнем шаге запроса (вывод рендеринга) заставляет мою кожу сканировать. Это также вводит так много шансов на ошибки. По моему мнению, я не одинок:
https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_upper_case_table_or_column_names