首页 > 解决方案 > 试图找到买过品牌1、只买过品牌2的顾客和刚买过品牌1和2的顾客一起

问题描述

我试图在每个品牌中找到独特的客户,并试图找出哪些客户同时购买了这两个品牌。

以下是我要起诉的查询:

WITH GROUPS AS (   

    SELECT 
     individual_id
    ,CASE WHEN COUNT(DISTINCT FML) = 1 THEN 'only '|| MAX(FML)
              ELSE 'cross'
              END AS GROUPS
    FROM DM_OWNER.transaction_detail_mv A JOIN sl_d1fml B ON A.SKU = B.SKU
    GROUP BY 
    individual_id
    )

    SELECT  
    g.GROUPS
    ,COUNT(DISTINCT t.individual_id) AS countIndv
    ,SUM(t.dollar_value_us)
    ,COUNT(t.transaction_number)
    ,SUM(t.quantity)
    FROM  DM_OWNER.transaction_detail_mv t
    JOIN GROUPS g
    ON t.individual_id = g.individual_id
    JOIN sl_d1fml C ON T.SKU = C.SKU
    WHERE BRAND_ORG_CODE = 'HT'
    AND t.is_merch = 1
    AND t.Line_Item_Amt_Type_Cd = 'S'
    AND TRUNC (t.TXN_DATE) between '01-JAN-18' AND '31-JAN-18'
    GROUP BY g.GROUPS;

我只是想知道查询是否正确以及如果有超过 2 个 FML 是否可以工作

标签: sql

解决方案


首先 获取个人的所有品牌。

在我使用的旧数据库中,wmsys.wm_concat但这似乎已过时,取而代之的是listagg

这是一个在您的 dbfiddle 中有效的查询。您可以添加到它以获得所需的其余列。

select individual_id, 
rtrim( regexp_replace((listagg(brand_org_code , '-') 
WITHIN GROUP (ORDER BY brand_org_code)), 
           '([^-]*)(-\1)+($|-)', 
           '\1\3'),
         '-') as brands, 
sum(dollar_value_us) dollar_sum
from transaction_detail_mv 
group by individual_id

其次 将其用作子查询。

select brands, sum(dollar_sum)
from (select individual_id, 
rtrim( regexp_replace((listagg(brand_org_code , '-') 
WITHIN GROUP (ORDER BY brand_org_code)), 
           '([^-]*)(-\1)+($|-)', 
           '\1\3'),
         '-') as brands, 
sum(dollar_value_us) dollar_sum
from transaction_detail_mv 
group by individual_id) table1
group by brands

推荐阅读