Tenho tabelas conectadas entre si por chaves estrangeiras (postgresql 13.1).
order: order_id, name
sub_order: mainorder, order_id (foreign key to order), detail
task_group: id, group_name
tasks: id, taskname, task_group_id (foregin key to group_name)
task_kind: id, kind_name
task_task_kind: id, kind_id(fk to task_kind), task_id (fk to task)
time_per_project: person, start_time, stop_time, part, order_id (foreign key to sub_order),
Espero ter descrito o suficiente. Minha consulta por visualização materializada é a seguinte e funciona muito bem:
SELECT
so.order_id AS order_id,
MIN(so.status) AS status_id,
SUM(AGE(tpp.stop_time, tpp.start_time)) AS total,
SUM(
CASE WHEN (tasksgroups.id = 1) THEN
AGE(tpp.stop_time, tpp.start_time)
END) AS srut,
SUM(
CASE WHEN (tpp.valve_part_id = 1) THEN
AGE(tpp.stop_time, tpp.start_time)
END) AS korpus,
SUM(
CASE WHEN (tasks_with_kinds.task_kind = 1) THEN
AGE(tpp.stop_time, tpp.start_time)
END) AS zwykle,
SUM(
CASE WHEN (tasks_with_kinds.task_kind = 6) THEN
AGE(tpp.stop_time, tpp.start_time)
END) AS wyprawki
FROM
intranet.sub_orders so
LEFT JOIN intranet.time_per_project tpp ON so.mainorder = tpp.project_id
LEFT JOIN intranet.task_task_kind tasks_with_kinds ON tasks_with_kinds.id = tpp.task
LEFT JOIN intranet.task tasks ON tasks.id = tasks_with_kinds.task_id
LEFT JOIN intranet.task_group tasksgroups ON tasksgroups.id = tasks.task_group
GROUP BY
so.order_id
HAVING (SUM(AGE(tpp.stop_time, tpp.start_time)) > interval '0 minutes');
Quero adicionar outra junção com a tabela da seguinte maneira:
article_group: id, group_name
article_cost: id, group_id (fk to article_group), order_id (fk to sub_orders)
Acabei com o join na subconsulta, pois para alguns projetos contava a mesma linha duas ou mais vezes
SELECT
so.order_id AS order_id,
MIN(so.status) AS status_id,
SUM(AGE(tpp.stop_time, tpp.start_time)) AS total,
SUM(
CASE WHEN (tasksgroups.id = 1) THEN
AGE(tpp.stop_time, tpp.start_time)
END) AS srut,
SUM(
CASE WHEN (tpp.valve_part_id = 1) THEN
AGE(tpp.stop_time, tpp.start_time)
END) AS korpus,
SUM(
CASE WHEN (tasks_with_kinds.task_kind = 1) THEN
AGE(tpp.stop_time, tpp.start_time)
END) AS zwykle,
SUM(
CASE WHEN (tasks_with_kinds.task_kind = 6) THEN
AGE(tpp.stop_time, tpp.start_time)
END) AS wyprawki,
ac.transport,
ac.service
FROM
intranet.sub_orders so
LEFT JOIN intranet.time_per_project tpp ON so.mainorder = tpp.project_id
LEFT JOIN intranet.task_task_kind tasks_with_kinds ON tasks_with_kinds.id = tpp.task
LEFT JOIN intranet.task tasks ON tasks.id = tasks_with_kinds.task_id
LEFT JOIN intranet.task_group tasksgroups ON tasksgroups.id = tasks.task_group
LEFT JOIN (
SELECT
soa.order_id AS ordid,
sum(
CASE WHEN group_id = 14 THEN
COST
END) AS transport,
sum(
CASE WHEN group_id = 11 THEN
COST
END) AS service
FROM
intranet.article_costs
INNER JOIN intranet.sub_orders soa ON soa.mainorder = project_id
GROUP BY
soa.order_id) ac ON ac.ordid = so.order_id
WHERE order_id = 2074
GROUP BY
so.order_id, ac.transport, ac.service
HAVING (SUM(AGE(tpp.stop_time, tpp.start_time)) > interval '0 minutes' OR ac.transport > 0 or ac.service > 0);
Gostaria de saber se você acha que esta consulta por visualização materializada está ok? Se verdadeiro, é possível obter o mesmo comportamento sem ter uma subconsulta com junção aninhada nela?
Sobre o mesmo comportamento sem subconsulta
WITH ac as(
SELECT
soa.order_id AS ordid,
sum(
CASE WHEN group_id = 14 THEN
COST
END) AS transport,
sum(
CASE WHEN group_id = 11 THEN
COST
END) AS service
FROM
intranet.article_costs
INNER JOIN intranet.sub_orders soa ON soa.mainorder = project_id
GROUP BY
soa.order_id
)
SELECT
so.order_id AS order_id,
MIN(so.status) AS status_id,
SUM(AGE(tpp.stop_time, tpp.start_time)) AS total,
SUM(
CASE WHEN (tasksgroups.id = 1) THEN
AGE(tpp.stop_time, tpp.start_time)
END) AS srut,
SUM(
CASE WHEN (tpp.valve_part_id = 1) THEN
AGE(tpp.stop_time, tpp.start_time)
END) AS korpus,
SUM(
CASE WHEN (tasks_with_kinds.task_kind = 1) THEN
AGE(tpp.stop_time, tpp.start_time)
END) AS zwykle,
SUM(
CASE WHEN (tasks_with_kinds.task_kind = 6) THEN
AGE(tpp.stop_time, tpp.start_time)
END) AS wyprawki,
ac.transport,
ac.service
FROM
intranet.sub_orders so
LEFT JOIN intranet.time_per_project tpp ON so.mainorder = tpp.project_id
LEFT JOIN intranet.task_task_kind tasks_with_kinds ON tasks_with_kinds.id = tpp.task
LEFT JOIN intranet.task tasks ON tasks.id = tasks_with_kinds.task_id
LEFT JOIN intranet.task_group tasksgroups ON tasksgroups.id = tasks.task_group
LEFT JOIN ac ON ac.ordid = so.order_id
WHERE order_id = 2074
GROUP BY
so.order_id, ac.transport, ac.service
HAVING (SUM(AGE(tpp.stop_time, tpp.start_time)) > interval '0 minutes' OR ac.transport > 0 or ac.service > 0);
Gostaria de saber se você acha que esta consulta por visualização materializada está ok?
Se os dados ou o tempo da consulta forem muito grandes - use materializar (mas antes - otimize a consulta).
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras