比 PostgreSQL 中相同 table 但不同条件的多个子查询更好的方法

Better way than multiple subquery for the same table but different criteria in PostgreSQL

例如,我可能有这样一个架构:

我想得到一些东西,比如:

| inventory_id | all_paid_merchandise_quantity | all_shipped_merchandise_quantity |
|--------------|-------------------------------|----------------------------------|
| 1            | 10                            | 100                              |
| 2            | 11                            | 12                               |

我已经想出了类似 all_paid_merchandise_quantity 的子查询和 all_shipped_merchandise_quantity 的子查询之类的东西。但是我想知道是否有更好的方法来做到这一点?

编辑:"ugly" 查询。

SELECT
    inventory.id AS inventory_id,
    (SELECT sum(order_items.quantity) FROM "order" LEFT JOIN "order_items" ON order_items.order_id="order".id WHERE "order".has_shipped=true AND "order_items".merchandise_id=merchandise.id) AS all_shipped_merchandise_quantity,
    (SELECT sum(order_items.quantity) FROM "order" LEFT JOIN "order_items" ON order_items.order_id="order".id WHERE "order".has_paid=true AND "order_items".merchandise_id=merchandise.id) AS all_paid_merchandise_quantity
FROM 
    inventory
LEFT JOIN merchandise ON merchandise.inventory_id=inventory.id
GROUP BY inventory.id, merchandise.id
ORDER BY inventory.id

尝试:

SELECT
    inventory.id AS inventory_id,
    merchandise.id AS merchandise_id,
    sum(order_items.quantity) FILTER (WHERE "order".has_shipped) AS all_shipped_merchandise_quantity,
    sum(order_items.quantity) FILTER (WHERE "order".has_paid) AS all_paid_merchandise_quantity
FROM 
    inventory
LEFT JOIN merchandise ON merchandise.inventory_id=inventory.id
LEFT JOIN "order_items" ON "order_items".merchandise_id=merchandise.id
LEFT JOIN "order" ON (order_items.order_id="order".id AND ("order".has_shipped OR "order".has_paid))
GROUP BY inventory.id, merchandise.id
ORDER BY inventory.id