Sql 试图找到购买了品牌1的客户,只有品牌2和刚刚一起购买了品牌1和品牌2的客户

Sql 试图找到购买了品牌1的客户,只有品牌2和刚刚一起购买了品牌1和品牌2的客户,sql,Sql,我试图在每个品牌中找到独特的客户,并试图找出哪些客户购买了这两个品牌 以下是我正在起诉的问题: 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_de

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

以下是我正在起诉的问题:

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;
我只是想知道这个查询是否正确,如果首先有两个以上的FML,它是否有效 为个人购买所有品牌

在旧的数据库中,我使用了wmsys.wm_concat,但它似乎已经过时,被listag取代

下面是一个在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