139 lines
4.7 KiB
SQL
139 lines
4.7 KiB
SQL
-- 福利品用户筛选:拥有两个年包课包(level1或level2各算一个年包)
|
||
-- goods_id: 31=level2/年包, 60=level1, 61=level1+2(算两个年包)
|
||
|
||
WITH
|
||
-- 目标订单(仅已完成/已退款,剔除测试账号)
|
||
target_orders AS (
|
||
SELECT
|
||
o.account_id,
|
||
o.trade_no,
|
||
o.goods_id,
|
||
o.goods_name,
|
||
o.key_from,
|
||
o.pay_success_date,
|
||
o.pay_amount_int,
|
||
o.order_status
|
||
FROM vala_bi.bi_vala_order o
|
||
JOIN vala_bi.bi_vala_app_account a ON o.account_id = a.id AND a.status = 1
|
||
WHERE o.goods_id IN (31, 60, 61)
|
||
AND o.order_status IN (3, 4)
|
||
AND o.pay_success_date IS NOT NULL
|
||
),
|
||
-- 退费信息(仅退费成功)
|
||
refund_info AS (
|
||
SELECT
|
||
trade_no,
|
||
refund_amount_int
|
||
FROM vala_bi.bi_refund_order
|
||
WHERE status = 3
|
||
),
|
||
-- 订单 + 退费标记
|
||
order_with_refund AS (
|
||
SELECT
|
||
t.*,
|
||
r.refund_amount_int AS refund_amt,
|
||
CASE
|
||
WHEN r.refund_amount_int IS NULL THEN 'none'
|
||
WHEN r.refund_amount_int < t.pay_amount_int THEN 'partial'
|
||
ELSE 'full'
|
||
END AS refund_type
|
||
FROM target_orders t
|
||
LEFT JOIN refund_info r ON t.trade_no = r.trade_no
|
||
),
|
||
|
||
-- ===== 情况1: goods_id=61, 无任何退费 =====
|
||
case1_users AS (
|
||
SELECT DISTINCT account_id
|
||
FROM order_with_refund
|
||
WHERE goods_id = 61 AND refund_type = 'none'
|
||
),
|
||
|
||
-- ===== 情况2: goods_id IN (31,60), >=2笔有效订单, 最多一笔400元部分退费 =====
|
||
case2_eligible AS (
|
||
SELECT
|
||
account_id,
|
||
COUNT(*) AS total_valid,
|
||
SUM(CASE WHEN refund_type = 'none' THEN 1 ELSE 0 END) AS no_refund_cnt,
|
||
SUM(CASE WHEN refund_type = 'partial' AND refund_amt = 40000 THEN 1 ELSE 0 END) AS partial_400_cnt,
|
||
SUM(CASE WHEN refund_type = 'full' THEN 1 ELSE 0 END) AS full_refund_cnt,
|
||
SUM(CASE WHEN refund_type = 'partial' AND refund_amt != 40000 THEN 1 ELSE 0 END) AS other_partial_cnt
|
||
FROM order_with_refund
|
||
WHERE goods_id IN (31, 60)
|
||
AND refund_type != 'full' -- 排除全额退款
|
||
GROUP BY account_id
|
||
HAVING COUNT(*) >= 2
|
||
AND SUM(CASE WHEN refund_type = 'partial' AND refund_amt = 40000 THEN 1 ELSE 0 END) <= 1
|
||
AND SUM(CASE WHEN refund_type = 'partial' AND refund_amt != 40000 THEN 1 ELSE 0 END) = 0
|
||
),
|
||
-- 排除全额退款的无效订单后的明细
|
||
case2_valid_orders AS (
|
||
SELECT *
|
||
FROM order_with_refund
|
||
WHERE goods_id IN (31, 60) AND refund_type != 'full'
|
||
),
|
||
case2_users AS (
|
||
SELECT DISTINCT account_id FROM case2_eligible
|
||
),
|
||
|
||
-- ===== 情况3: goods_id IN (31,60) 至少一笔无退费 + goods_id=61 一笔退费1999 =====
|
||
case3_has_31_60 AS (
|
||
SELECT DISTINCT account_id
|
||
FROM order_with_refund
|
||
WHERE goods_id IN (31, 60) AND refund_type = 'none'
|
||
),
|
||
case3_has_61_1999 AS (
|
||
SELECT DISTINCT account_id
|
||
FROM order_with_refund
|
||
WHERE goods_id = 61 AND refund_type = 'partial' AND refund_amt = 199900
|
||
),
|
||
case3_users AS (
|
||
SELECT a.account_id
|
||
FROM case3_has_31_60 a
|
||
JOIN case3_has_61_1999 b ON a.account_id = b.account_id
|
||
),
|
||
|
||
-- ===== 合并所有符合条件的用户 =====
|
||
all_eligible_users AS (
|
||
SELECT account_id FROM case1_users
|
||
UNION
|
||
SELECT account_id FROM case2_users
|
||
UNION
|
||
SELECT account_id FROM case3_users
|
||
)
|
||
|
||
-- ===== 最终输出:符合条件的用户 + 其所有相关订单 + parent_address =====
|
||
SELECT
|
||
ou.account_id::text AS "用户ID",
|
||
r.trade_no AS "交易号",
|
||
r.goods_id AS "商品ID",
|
||
r.goods_name AS "商品名称",
|
||
r.key_from AS "渠道",
|
||
r.pay_success_date AS "购课日期",
|
||
r.pay_amount_int / 100.0 AS "支付金额(元)",
|
||
r.refund_amt / 100.0 AS "退款金额(元)",
|
||
r.refund_type AS "退费状态",
|
||
pa.name AS "收件人",
|
||
pa.phone_number AS "电话",
|
||
pa.region AS "区域",
|
||
pa.address AS "地址",
|
||
CASE
|
||
WHEN ou.account_id IN (SELECT account_id FROM case1_users) THEN '情况1'
|
||
WHEN ou.account_id IN (SELECT account_id FROM case2_users) THEN '情况2'
|
||
WHEN ou.account_id IN (SELECT account_id FROM case3_users) THEN '情况3'
|
||
END AS "来源情况"
|
||
FROM all_eligible_users ou
|
||
JOIN (
|
||
-- 输出情况1的订单
|
||
SELECT * FROM order_with_refund WHERE goods_id = 61 AND refund_type = 'none' AND account_id IN (SELECT account_id FROM case1_users)
|
||
UNION ALL
|
||
-- 输出情况2的订单(仅有效订单)
|
||
SELECT * FROM case2_valid_orders WHERE account_id IN (SELECT account_id FROM case2_users)
|
||
UNION ALL
|
||
-- 输出情况3的订单(包含31/60无退费 + 61退费1999)
|
||
SELECT * FROM order_with_refund
|
||
WHERE (goods_id IN (31, 60) AND refund_type = 'none' AND account_id IN (SELECT account_id FROM case3_users))
|
||
OR (goods_id = 61 AND refund_type = 'partial' AND refund_amt = 199900 AND account_id IN (SELECT account_id FROM case3_users))
|
||
) r ON ou.account_id = r.account_id
|
||
LEFT JOIN vala_class.parent_address pa ON ou.account_id::text = pa.account_id
|
||
ORDER BY ou.account_id, r.goods_id, r.trade_no;
|