Необходимо найти транзакции, которые разделены и по их уровням

#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      
  

db<> скрипта

Затем вы можете отфильтровать транзакции с 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. Мне просто нужно количество разделенных и отдельных транзакций, и я также хочу сумму их количеств