Вы можете использовать внешнее объединение между вашими таблицами, чтобы включить как POD, так и не POD SKU, а затем использовать выражения регистров и, возможно, аналитические (оконные) функции для сравнения строк в одной и той же транзакции; например:
select td.transaction_number, td.sku,
case when ps.sku is not null
then 'Yes'
else 'No'
end as is_pod_sku,
case when count(ps.sku) over (partition by td.transaction_number) > 0
then 'Yes'
else 'No'
end as has_pod_sku,
case when count(ps.sku) over (partition by td.transaction_number) > 0
and count(ps.sku) over (partition by td.transaction_number)
< count(*) over (partition by td.transaction_number)
then 'Yes'
else 'No'
end as is_split
from transaction_detail_mv td
left join pod_sku ps on ps.sku = td.sku;
TRANSACTION_NUMBER SKU IS_POD_SKU HAS_POD_SKU IS_SPLIT
------------------ ---------- ---------- ----------- --------
323 566373 No No No
345 773633 Yes Yes Yes
345 965322 No Yes Yes
567 123767 No Yes Yes
567 903633 Yes Yes Yes
678 838364 Yes Yes No
855 678364 Yes Yes No
910 363635 No No No
975 983636 No No No
дб <> скрипка
Затем вы можете отфильтровать их с has_pod_sku
из «Нет». Очевидно (надеюсь), вы можете включить любые столбцы из исходной таблицы, которые вы хотите, я только что показал два, которые казались наиболее актуальными на данный момент. Вместо этого вы можете использовать флаги 0/1 или Y / N или более описательный текст, если «Да» и «Нет». Детали зависят от того, что именно вы хотите увидеть в конце.
есть ли способ их подсчитать
Вы можете использовать приведенный выше запрос как подзапрос и подсчитывать каждое значение флага (после исключения тех, у которых вообще нет SKU POD):
select count(distinct case when is_split = 'Yes' then transaction_number end) as split,
count(distinct case when is_split = 'No' then transaction_number end) as single
from (
select td.transaction_number, td.sku,
case when count(ps.sku) over (partition by td.transaction_number) > 0
then 'Yes'
else 'No'
end as has_pod_sku,
case when count(ps.sku) over (partition by td.transaction_number) > 0
and count(ps.sku) over (partition by td.transaction_number)
< count(*) over (partition by td.transaction_number)
then 'Yes'
else 'No'
end as is_split
from transaction_detail_mv td
left join pod_sku ps on ps.sku = td.sku
)
where has_pod_sku = 'Yes';
SPLIT SINGLE
---------- ----------
2 2
или более просто:
select count(case when sku_count > pod_sku_count then transaction_number end) as split,
count(case when sku_count = pod_sku_count then transaction_number end) as single
from (
select td.transaction_number,
count(*) as sku_count,
count(ps.sku) as pod_sku_count
from transaction_detail_mv td
left join pod_sku ps on ps.sku = td.sku
group by td.transaction_number
)
where pod_sku_count > 0;
SPLIT SINGLE
---------- ----------
2 2
db <> fiddle с этими двумя добавленными запросами.