我有以下两个查询,一个是给我总零件作为输出,另一个是给我总分派(dispatch)零件作为输出。我的目标是获得将由“总零件 - 分派(dispatch)零件”给出的总待处理零件。我将如何直接从查询中获得此结果。
代码:
--total parts
select
dispatches.id,
count(parts.id) as total_parts
from dispatch_projects,dispatches,parts
where
dispatches.id=dispatch_projects.dispatch_id and
parts.project=dispatch_projects.project and
parts.ignore=false and
dispatch_projects.deleted = false and
dispatches.created > now() - interval '15 days'
group by dispatches.id
order by dispatches.id
--total dispatched parts
select
dispatches.id,
count(parts.id) as dispatched_parts
from dispatch_projects,dispatches,parts,boxes
where
dispatches.id=dispatch_projects.dispatch_id and
parts.project=dispatch_projects.project and
parts.box_id=boxes.id and
boxes.project=dispatch_projects.project and
parts.ignore=false and
dispatch_projects.deleted = false and
dispatches.created > now() - interval '15 days'
group by dispatches.id
order by dispatches.id
最佳答案
我们可以在单个查询中获得您想要的结果。
请注意,您的第二个查询与第一个查询的主要区别在于对 boxes
表的额外连接。结果,术语 count(parts.id)
实际上在第一个查询中计算了零件的数量,现在将在第二个查询中计算盒子的数量。但是,我们仍然可以通过取 count(distinct parts.id)
来获取第二个查询中的总零件数。这是有效的,因为它会忽略由于加入 boxes
表而可能发生的部件上的任何重复。考虑以下查询:
SELECT
d.id,
COUNT(DISTINCT p.id) - COUNT(p.id) as result
FROM dispatch_projects dp
INNER JOIN dispatches d
ON d.id = dp.dispatch_id
INNER JOIN parts p
ON p.project = dp.project
INNER JOIN boxes b
ON p.box_id = b.id AND
b.project = dp.project
WHERE
p.ignore = false AND
dp.deleted = false AND
d.created > now() - INTERVAL '15 days'
GROUP BY
d.id
ORDER BY
d.id;
请注意,我已将您的逗号分隔连接替换为显式内部连接。这被认为是首选语法。
关于sql - 如何在postgres中执行减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48982037/