Нужно найти транзакции, которые разделены и сами по себе - PullRequest
0 голосов
/ 29 марта 2019

У меня есть список SKU, которые являются только POD в отдельной таблице.Мне нужно найти транзакции, в которых есть SKU POD, и транзакции, в которых есть SKU POD, а также некоторые другие SKU.

Я приложил образец базы данных, которую я создал.

https://dbfiddle.uk/?rdbms=oracle_11.2&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 будут разделенными транзакциями, поскольку каждая из них имеет SKU POD кака также некоторые другие SKU в той же транзакцииИ транзакции 975 и 855 будут отдельными транзакциями, потому что они имеют только SKU POD.

Это формат, который я ищу: txn_count сумма (количество) split 2?холост 2?

1 Ответ

1 голос
/ 29 марта 2019

Вы можете использовать внешнее объединение между вашими таблицами, чтобы включить как 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 с этими двумя добавленными запросами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...