2015-01-29 2 views
2

У меня есть следующая схема:SQL Выберите данные, основанные на группе продукта

PRODUCT_MASTER_TB 

PRODUCT_CODE CATEGORY MODEL_GROUP 
    A   1   1   
    B   1   1    
    C   1   2 
    D   1   2 
    E   2   2 

SALES_TB 


SALES_DATE  PRODUCT_CODE  SOLD_QTY 
20150101    A    2 
20150101    A    3 
20150102    A    4 
20150102    B    5 
20150103    B    6 
20150104    C    7 
... 

То, что я хотел бы, чтобы выбрать из этих двух таблицы является общим количеством проданного Кола-во для каждого кода продукта на основе по категории и группе моделей код продукта находится под.

Например:

Sales date from 20150101 - 20150104 

PRODUCT_CODE SOLD_QTY_FOR_CATEGORY_MODEL 
    A     20     
    B     20 
    C      7 
    ... 

А и В имеют ту же категорию и model_group, так что если вы добавите их продали Количество, вы получаете 20 каждый (2 + 3 + 4 + 5 + 6)

Я думал об использовании fetch для решения вышеуказанной проблемы, но есть ли способ использования объединений для получения результата, который я хочу?

ответ

1

вы можете сделать агрегацию, основанную на category и model_group в подзапросе и присоединиться к product_master_tb, используя left join, чтобы получить результаты для всех продуктов, если нет количества продается за указанный диапазон дат, он будет возвращать нулевое значение для таких продуктов

select pmt.PRODUCT_CODE , isnull(t.soldqty,0) as SOLD_QTY_FOR_CATEGORY_MODEL 
from PRODUCT_MASTER_TB pmt 
left JOIN (
    select pmt.CATEGORY, pmt.MODEL_GROUP, SUM(sold_qty) soldqty 
    from PRODUCT_MASTER_TB PMT 
    join SALES_TB ST 
    on pmt.PRODUCT_CODE = st.PRODUCT_CODE 
    where SALES_DATE between '20150101' and '20150104' 

    GROUP BY PMT.CATEGORY, pmt.MODEL_GROUP) t 
on pmt.MODEL_GROUP = t.MODEL_GROUP 
and pmt.CATEGORY = t.CATEGORY 
0

Это странное требование, потому что вы умножив общую сумму sold_qty. Идея, однако, состоит в добавлении категории и модель группы, а затем группы по этой информации:

select pm.PRODUCT_CODE, SOLD_QTY_FOR_CATEGORY_MODEL 
from product_master_tb pm join 
    (select pm.category, pm.model_group, 
      sum(sold_qty) as SOLD_QTY_FOR_CATEGORY_MODEL 
     from sales_tb s join 
      product_master_tb pm 
      on s.product_code = pm.product_code 
     group by category, model_group 
    ) cm 
    on pm.category = cm.category and pm.model_group = cm.model_group; 
0

Вы хотите первый sum по CATEGORY и MODEL_GROUP, а затем присоединиться к этому набору данных обратно в PRODUCT_MASTER_TB получить ассоциированные PRODUCT_CODE:

with CATEGORY_MODEL as 
    (
    select 
     p.CATEGORY, 
     p.MODEL_GROUP, 
     sum(s.SOLD_QTY) as SOLD_QTY_FOR_CATEGORY_MODEL 
    from PRODUCT_MASTER_TB as p 
     inner join SALES_TB as s 
      on s.PRODUCT_CODE = p.PRODUCT_CODE 
    group by 
     p.CATEGORY, 
     p.MODEL_GROUP 
    ) 
    select 
     p.PRODUCT_CODE, 
     cm.SOLD_QTY_FOR_CATEGORY_MODEL 
    from PRODUCT_MASTER_TB as p 
     inner join CATEGORY_MODEL cm 
      on cm.CATEGORY = p.CATEGORY 
      and cm.MODEL_GROUP = p.MODEL_GROUP 
Смежные вопросы