2017-01-12 6 views
0

Я ищу способ повторного агрегирования некоторых строк с данными агрегирования из другой таблицы.Совокупные строки, основанные на другой информации таблицы

  • У меня есть 1 стол с подробной информацией: билеты с SKUs
  • Другой таблицей дают состав групп артикулов, которые фактически были проданы вместе (т.е. пакет СКА)
  • Я хотел бы обратиться моя подробная таблица билетов, идентифицируя группу SKU в каждом билете, и, когда это возможно, объединить все SKUs принадлежащего к одной и той же упаковке в 1 строку с идентификатором/именем пакета

Вот подробная таблица билетов:

ticket_id SKU  qty 
1   A   1 
1   B   2 
1   C   1 
1   D   1 
1   E   1 
2   F   1 
2   G   2 
2   B   1 
2   H   2 

Вот Packs состав таблицы:

group_id SKU  SKU_qty 
A1   A  1 
A1   B  2 
A1   C  1 
A1   D  1 
B2   F  1 
B2   G  2 
B2   B  1 

С подробной таблице билета, мы можем видеть, что:

  • билет 1 имеет фактически A1 группу SKU
  • билет 2 имеет B2

Таким образом, итоговая таблица после слияния всех пакетов ску в 1 строку:

ticket_id SKU  qty 
1   A1   1 
1   E   1 
2   B2   1 
2   H   2 

Билеты могут иметь другие SKU - не являются частью любой упаковки; тот же SKU можно найти в нескольких пакетах.

Доступны несколько языков (SQL, SAS или R), но мой первый «выстрел» - это попробовать SQL.

Я действительно не знаю, с чего начать ... заранее спасибо

+2

Данные вашего примера действительно сбивают с толку. Трудно понять проблему, которую вы пытаетесь решить, как эти таблицы связаны и как ваша финальная таблица может быть получена из двух других. Можете ли вы объяснить свои примеры немного дальше? –

+0

@OliverFrost Отредактировано с дополнительной информацией – ant1j

ответ

1

Вы можете попробовать ниже запрос

SELECT ticket_id, 
     case when sku is null then sku1 else group_id end group_id, 
     qty 
FROM(
    select ticket_id, group_id, g.sku, d.sku sku1, 
      ROW_NUMBER() OVER(PARTITION BY ticket_id) row_num, 
      qty 
    from detail d 
    left join grouping_ g 
    on d.SKU = g.SKU 
    order by ticket_id, D.sku)T1 
WHERE sku IS NULL OR row_num = 1; 

SQL DEMO

Ниже выход я получил,

enter image description here

Надеюсь, что этот woul d помочь вам.

+1

Я понятия не имею, как вы отработали это из приведенных примеров, но если это так, то это правда! –

+0

Есть ли вероятность, что вы сможете объяснить принципы своего запроса, чтобы понять, почему он работает? – ant1j

Смежные вопросы