sql - 试图找到买过品牌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 是否可以工作
解决方案
首先 获取个人的所有品牌。
在我使用的旧数据库中,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
推荐阅读
- marklogic - 带约束的 MarkLogic 搜索返回错误结果
- .net - .NET core 2.1 模板缺失
- angular - angular-cli 的 environmentSource 文件是否总是加载?
- angular-services - Angular 6 服务,HTTPClient
- javascript - 如何更改汉堡包的背景颜色
- spring - Spring MVC 控制器创建文件路径
- javascript - 具有动画滑动效果的移动行
- r - 使用 grep 函数进行文本挖掘
- php - 在 PHP Laravel 中同时使用 $gte 和 $lte 时,MongoDB 太慢了
- c++ - Qt 中的屏幕录制