SQL根据产品组选择数据

时间:2015-01-29 02:43:07

标签: sql sql-server

我有以下架构:

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
   ...

A和B具有相同的类别和model_group,因此如果你添加他们卖出的数量,你可以获得20个(2 + 3 + 4 + 5 + 6)

我考虑过使用fetch来解决上述问题,但有没有办法使用连接来获得我想要的结果?

3 个答案:

答案 0 :(得分:1)

您可以在子查询中根据categorymodel_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

答案 1 :(得分: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;

答案 2 :(得分:0)

您希望sumCATEGORY之前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