Я бы подумал, если бы вы агрегировали количества каждой детали для всех заказов в CTE, например:
with summary as (
select
order_id,
sum (case when product_id = 'A' then quantity else 0 end) as a,
sum (case when product_id = 'B' then quantity else 0 end) as b,
sum (case when product_id = 'C' then quantity else 0 end) as c,
sum (case when product_id = 'D' then quantity else 0 end) as d
from table
where quantity != 0
group by order_id
)
(Примечание: вы сказали, что product_id - это целое число, но перечисленные значения являются текстовыми- Я предполагаю, что есть разумное объяснение, но я не пытался согласовать это)
Вы можете использовать это в качестве основы для ответа на каждый из трех вопросов:
Для каждого заказа, содержащегопродукты A, B и C, дайте мне количества для продуктов C и D
select order_id, c, d
from summary
where a > 0 and b > 0 and c > 0
Для каждого заказа, содержащего продукты A и (B или C), дайте мне количества для продукта D
select order_id, d
from summary
where a > 0 and (b > 0 or c > 0)
Для каждого заказа, содержащего продукты A и не менее 2 * B, дайте мне количества для A, B и C
select order_id, a, b, c
from summary
where a > 0 and (a + b + c + d > 2 * b)
Я бы также обернул "резюме" в материализованное представление, если выя собираюсь запустить множество подобных сценариев, особенно с объемами данных, о которых вы говорите.
Если пример условный и на самом деле существует сотни или более номеров элементов, то я бы пропустил CTE / vieи построить каждый случай с соответствующим сценарием.