119 lines
3.9 KiB
SQL
119 lines
3.9 KiB
SQL
-- 福利品用户筛选 SQL(支持日期范围)
|
||
-- 参数: ${START_DATE} 和 ${END_DATE},格式 YYYY-MM-DD
|
||
-- 不指定日期范围则查询全部历史数据
|
||
-- 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 bi_vala_order o
|
||
JOIN 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
|
||
AND o.pay_amount_int >= 100000
|
||
-- 日期范围过滤(占位符)
|
||
AND pay_success_date::date BETWEEN '2025-09-01' AND '2026-05-19'
|
||
),
|
||
refund_info AS (
|
||
SELECT trade_no, refund_amount_int
|
||
FROM 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
|
||
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_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, '情况1' AS case_type FROM case1_users
|
||
UNION
|
||
SELECT account_id, '情况2' AS case_type FROM case2_users
|
||
UNION
|
||
SELECT account_id, '情况3' AS case_type FROM case3_users
|
||
),
|
||
user_cases AS (
|
||
SELECT
|
||
account_id,
|
||
STRING_AGG(DISTINCT case_type, '+' ORDER BY case_type) AS case_labels
|
||
FROM all_eligible_users
|
||
GROUP BY account_id
|
||
),
|
||
eligible_orders AS (
|
||
SELECT * FROM order_with_refund WHERE goods_id = 61 AND refund_type = 'none' AND account_id IN (SELECT account_id FROM case1_users)
|
||
UNION
|
||
SELECT * FROM order_with_refund WHERE goods_id IN (31, 60) AND refund_type != 'full' AND account_id IN (SELECT account_id FROM case2_users)
|
||
UNION
|
||
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))
|
||
)
|
||
|
||
SELECT
|
||
eo.account_id AS "用户ID",
|
||
eo.trade_no AS "交易号",
|
||
eo.goods_id AS "商品ID",
|
||
eo.goods_name AS "商品名称",
|
||
eo.key_from AS "渠道",
|
||
TO_CHAR(eo.pay_success_date, 'YYYY-MM-DD HH24:MI:SS') AS "购课日期",
|
||
eo.pay_amount_int / 100.0 AS "支付金额(元)",
|
||
eo.refund_amt / 100.0 AS "退款金额(元)",
|
||
eo.refund_type AS "退费状态",
|
||
uc.case_labels AS "来源情况"
|
||
FROM eligible_orders eo
|
||
JOIN user_cases uc ON eo.account_id = uc.account_id
|
||
ORDER BY eo.account_id, eo.goods_id, eo.trade_no;
|