首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAP匹配字符串模式和组合

SAP匹配字符串模式和组合
EN

Stack Overflow用户
提问于 2020-03-18 02:49:16
回答 1查看 4K关注 0票数 0

我使用HANA,并试图根据列中的多个值组合从表中提取数据:

下面是我的客户表布局:

表A:

客户辅助产品

ABC

ABC

ABC

ABC

ABC

ABC

ABC

以下是销售活动的规则:

组合:

Campaign_Name  Products_Purchased

Campaign_1 -商品-商品(P1 & P2 & P3)

Campaign_2 (G2或G4)和G6

如果客户购买了P1、P2和P3的所有产品,那么它就有资格购买Campaign_1。

如果客户从(G2或G4 )和G6购买任何产品,那么它就有资格购买Campaign_2。

在这个例子中,由于客户'ABC‘购买了活动中提到的产品的组合,它将符合这两个活动的条件。

预期结果:

客户成分股Sales_Campaign

ABC

ABC

以下是我迄今所执行的步骤:

步骤1:我提取了在客户级别购买的所有产品。Step2:我将客户购买的所有产品合并成一行,用逗号分隔。

步骤3:在case语句中手动提供所有可能的组合,并为每个战役设置一个标志列,以确定客户是否购买了任何合格的sales_campaigns。

第四步:如果国旗是'Y‘,那么我提取了各自的竞选名称。

,但是如果产品数量增加,那么上面的步骤3就不可能得到.

Step2结果:

Customer P_COMBO G_COMBO

P1,P2,P3    #,1,G2,G4,G5,G6

Step4结果:

Customer campaign1_flag Campaign2_flag

ABC

代码语言:javascript
复制
SELECT DISTINCT
  B.CUSTOMER
  CASE WHEN P_COMBO ='#,1,P1,P2,P3' THEN 'Y' ELSE 'N' END) AS campaign1_flag,
  (CASE 
     WHEN G_COMBO  ='#,1,G2,G6'       THEN 'Y'
     WHEN G_COMBO  ='#,1,G4,G6'       THEN 'Y'
     WHEN G_COMBO  ='#,1,G2,G5,G6'    THEN 'Y'
     WHEN G_COMBO  ='#,1,G4,G5,G6'    THEN 'Y'
     WHEN G_COMBO  ='#,1,G2,G4,G5,G6' THEN 'Y'
     ELSE 'N'
  END) AS Campaign2_flag
FROM (
  SELECT DISTINCT
    A.CUSTOMER ,
    (   MAX(CASE WHEN A.PRODUCT= '1'  THEN A.PRODUCT ELSE '#' END)
      || MAX(CASE WHEN A.PRODUCT= 'P1'  THEN ',' || A.PRODUCT ELSE '' END)
      || MAX(CASE WHEN A.PRODUCT= 'P2'  THEN ',' || A.PRODUCT ELSE '' END)
      || MAX(CASE WHEN A.PRODUCT= 'P3'  THEN ',' || A.PRODUCT ELSE '' END)
    ) AS P_COMBO  ,
    (   MAX(CASE WHEN A.PRODUCT= '1'  THEN A.PRODUCT ELSE '#' END)
      || MAX(CASE WHEN A.PRODUCT= 'G2'  THEN ',' || A.PRODUCT ELSE '' END)
      || MAX(CASE WHEN A.PRODUCT= 'G4'  THEN ',' || A.PRODUCT ELSE '' END)
      || MAX(CASE WHEN A.PRODUCT= 'G5'  THEN ',' || A.PRODUCT ELSE '' END)
      || MAX(CASE WHEN A.PRODUCT= 'G6'  THEN ',' || A.PRODUCT ELSE '' END)
    ) AS G_COMBO
    FROM
    (SELECT DISTINCT CUSTOMER,PRODUCT FROM customer) A
    GROUP BY CUSTOMER,2,3
 ) B

请帮我找到更好的解决办法。任何想法都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2020-03-26 05:46:45

如果允许更改存储哪些组的定义进入竞选活动的方式,那么以下解决方案是可能的:

  1. Campaign由一组组定义。
  2. 组包含产品ID或名称。
  3. 任何组都可以被视为OR组,这意味着要匹配该组,必须购买该组中的至少一个产品。或者,组可以是AND组,这意味着需要购买所有的产品来匹配这个组。

这看起来是这样的:

代码语言:javascript
复制
create column table camp_grps
    (camp NVARCHAR(20) not null
    , grp integer not null
    , grp_type NVARCHAR(3) not null
    , product NVARCHAR(20) not null);


insert into camp_grps values
    ('Campaign 1', '1', 'AND', 'P1');
insert into camp_grps values
    ('Campaign 1', '1', 'AND', 'P2');
insert into camp_grps values
    ('Campaign 1', '1', 'AND', 'P3');

insert into camp_grps values
    ('Campaign 2', '1', 'OR', 'G2');
insert into camp_grps values
    ('Campaign 2', '1', 'OR', 'G4');
insert into camp_grps values
    ('Campaign 2', '2', 'AND', 'G6');  


CAMP       | GRP    | GRP_TYPE| PRODUCT
-----------|--------|---------|-------  
Campaign 1 |    1   |   AND   |     P1     
Campaign 1 |    1   |   AND   |     P2     
Campaign 1 |    1   |   AND   |     P3     
Campaign 2 |    1   |   OR    |     G2     
Campaign 2 |    1   |   OR    |     G4     
Campaign 2 |    2   |   AND   |     G6  

现在我们可以简单地了解一下

  • campaign,
  • 每组中的组包括
  • 的组型、
  • 多少组组成的活动和

H 120组成每个组的产品数量。

用于此的SQL如下所示:

代码语言:javascript
复制
select 
    camp
  , grp
  , grp_type
  , count(distinct grp) over
      (partition by camp)     camp_grp_cnt
  , count(*) prd_cnt
from
    camp_grps
group by
    camp, grp, grp_type;   

CAMP        |GRP    |GRP_TYPE   |CAMP_GRP_CNT   |PRD_CNT
------------|-------|-----------|---------------|-------
Campaign 1  |1      |AND        |1              |3      
Campaign 2  |1      |OR         |2              |2      
Campaign 2  |2      |AND        |2              |1      

其余的都有点乏味,但并不是太复杂。我们需要

  • 计算每个客户对每个grp的匹配购买量--取决于组的类型(AND/OR),我们需要在与组匹配的数量大于0 (OR组)或至少组中的产品数量(AND组)时,将组计算为匹配的组。

合并的SQL如下所示:

代码语言:javascript
复制
with grp_ref as
    (select 
         camp
       , grp
       , grp_type
       , count(distinct grp) over
           (partition by camp)     camp_grp_cnt
       , count(*) prd_cnt
    from
        camp_grps
    group by
        camp, grp, grp_type),
grp_match as
(select 
     p.customer, p.product
   , gr.camp camp_ref, gr.grp grp_ref, gr.grp_type grp_type_ref, gr.prd_cnt prd_cnt_ref
   , gr.camp_grp_cnt
   , count(*) over
        (partition by p.customer, cg.camp, gr.grp) camp_total_matches
from 
        purchases p
    left outer join camp_grps cg
            on p.product = cg.product
    inner join grp_ref gr
        on (cg.camp, cg.grp) = (gr.camp, gr.grp)),
match_cnter as 
 (select
      customer, product
    , camp_ref, grp_ref, grp_type_ref, prd_cnt_ref, camp_total_matches
    , camp_grp_cnt
    , case 
        when grp_type_ref = 'AND' 
            and ((camp_total_matches - prd_cnt_ref) >= 0) then
                'AND grp matched'
        when grp_type_ref = 'OR' 
            and (camp_total_matches > 1) then
                'OR grp matched'
      end matched_grp_info
    , case 
        when grp_type_ref = 'AND' 
            and ((camp_total_matches - prd_cnt_ref) >= 0) then
                1
        when grp_type_ref = 'OR' 
            and (camp_total_matches > 1) then
                1
      end matched_grp
 from 
    grp_match)
select  
    customer, camp_ref, SUM(matched_grp), MIN(camp_grp_cnt)
from 
    match_cnter
group by 
    customer, camp_ref;

结果如下:

代码语言:javascript
复制
CUSTOMER    |CAMP_REF   |SUM(MATCHED_GRP)   | MIN(CAMP_GRP_CNT)
------------|-----------|-------------------|---------------------------
ABC         |Campaign 1 |3                  |1                
ABC         |Campaign 2 |3                  |2                
XYZ         |Campaign 1 |?                  |1                

根据CUSTOMERCAMP_REF (活动参考),我们看到有多少组竞选团队已经被匹配(SUM(MATCHED_GRP)),以及有多少需要匹配才有资格参加竞选(MIN(CAMP_GRP_CNT))。

Customer ABC有资格使用活动1和2,而customer XYZ没有匹配任何组(请参见结果中的?作为NULL )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60732853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档