#sql #oracle
#sql #Oracle
Вопрос:
У меня есть список артикулов, которые являются только POD в отдельной таблице. Мне нужно найти транзакции, в которых есть артикул POD, и транзакции, в которых есть артикул POD, а также некоторые другие артикулы с ним.
Я прикрепил образец базы данных, которую я создал.
https://dbfiddle.uk/?rdbms=oracle_11.2amp;fiddle=c2150662b298b8d172c6902514ada52a
и это данные в этих таблицах:
select * from transaction_detail_mv;
INDIVIDUAL_ID DOLLAR_VALUE_US QUANTITY TRANSACTION_NUMBER SKU TXN_DATE BRAND IS_MERCH CURRE L
------------- --------------- ---------- ------------------ ---------- ---------- ----- ---------- ----- -
1 10 30 567 903633 2019-02-01 BRAND 1 USD S
1 20 30 567 123767 2019-02-01 BRAND 1 USD S
1 10 40 345 773633 2019-02-10 BRAND 1 USD S
1 12 30 345 965322 2019-02-10 BRAND 1 USD S
1 10 50 678 838364 2019-02-15 BRAND 1 USD S
1 10 70 975 983636 2019-02-28 BRAND 1 USD S
2 11 80 910 363635 2019-02-11 BRAND 1 USD S
2 11 90 323 566373 2019-02-12 BRAND 1 USD S
3 11 62 855 678364 2019-02-12 BRAND 1 USD S
select * from POD_SKU;
SKU
----------
903633
773633
838364
678364
Например, номера транзакций 567 и 345 будут разделенными транзакциями, потому что каждая из них имеет артикул POD, а также некоторые другие артикулы в одной транзакции. И транзакции 975 и 855 будут отдельными транзакциями, потому что у них есть только артикулы POD.
Это формат, который я ищу: txn_count сумма (количество) разделить на 2? single 2?
Комментарии:
1. Как далеко вы уже продвинулись (есть ли запрос, который частично работает, который вы можете добавить к вопросу)? И какой вывод вы ищете?
2. Также вы действительно имеете в виду, что 975 разделен, поскольку у него вообще нет артикула POD? Может быть, вы на самом деле имели в виду 678 и 855?
3. @AlexPoole да, это правильно. также я не могу найти способ показать их в виде количества
Ответ №1:
Вы можете использовать внешнее соединение между вашими таблицами, чтобы включить как POD, так и не POD артикулы, а затем использовать выражения прецедентов и, возможно, аналитические (оконные) функции для сравнения по строкам для одной и той же транзакции; например:
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 или более описательный текст вместо этого, если «Да» и «Нет». Детали зависят от того, что именно вы хотите увидеть в итоге.
есть ли способ их подсчитать
Вы могли бы использовать приведенный выше запрос в качестве подзапроса и подсчитать значение каждого флага (после исключения тех, у которых вообще нет артикулов 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 с добавлением этих двух запросов.
Комментарии:
1. есть ли способ подсчитать их и выдать результат в следующем формате: разделенная транзакция — (количество) отдельные транзакции -(количество)
2. Ну, вы можете просто использовать запрос, который я показал, как подзапрос (встроенное представление или CTE) и подсчитать, сколько из них имеют
is_split
значение «да», а сколько имеютis_split
значение «нет»? Но это все, что вы хотите знать — не какие транзакции задействованы или что-либо еще о них?3. Это работает, но я пытался добавить количество для каждой транзакции, но это ничего мне не дает
4. Все равно было бы действительно полезно, если бы вы включили выходные данные, которые вы на самом деле ищете, в свой вопрос. Я не понимаю, как ваши последние два комментария работают вместе; в первом говорится, что вам нужно общее количество транзакций, во втором говорится, что вы хотите что-то посчитать? для каждой транзакции. Но каждая транзакция либо разделена, либо нет, поэтому я не понимаю, как вы делаете и то, и другое.
5. Мне просто нужно количество разделенных и отдельных транзакций, и я также хочу сумму их количеств