我使用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
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请帮我找到更好的解决办法。任何想法都是非常感谢的。
发布于 2020-03-26 05:46:45
如果允许更改存储哪些组的定义进入竞选活动的方式,那么以下解决方案是可能的:
OR组,这意味着要匹配该组,必须购买该组中的至少一个产品。或者,组可以是AND组,这意味着需要购买所有的产品来匹配这个组。这看起来是这样的:
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 现在我们可以简单地了解一下
H 120组成每个组的产品数量。
用于此的SQL如下所示:
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 其余的都有点乏味,但并不是太复杂。我们需要
AND/OR),我们需要在与组匹配的数量大于0 (OR组)或至少组中的产品数量(AND组)时,将组计算为匹配的组。合并的SQL如下所示:
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;结果如下:
CUSTOMER |CAMP_REF |SUM(MATCHED_GRP) | MIN(CAMP_GRP_CNT)
------------|-----------|-------------------|---------------------------
ABC |Campaign 1 |3 |1
ABC |Campaign 2 |3 |2
XYZ |Campaign 1 |? |1 根据CUSTOMER和CAMP_REF (活动参考),我们看到有多少组竞选团队已经被匹配(SUM(MATCHED_GRP)),以及有多少需要匹配才有资格参加竞选(MIN(CAMP_GRP_CNT))。
Customer ABC有资格使用活动1和2,而customer XYZ没有匹配任何组(请参见结果中的?作为NULL )。
https://stackoverflow.com/questions/60732853
复制相似问题