业务方要求获取2018年,系统中待流失客户的交易额sql
t_customer_pool
表存储的是待流失客户,每一个月1号都会有定时任务按照规则刷新表中的数据SELECT
c.cust_id "客户ID",
c.cust_name "客户名称",
sum(o.amount) "交易金额"
FROM
t_order o
INNER JOIN t_customer c ON o.cust_id = c.cust_id
WHERE
o.pay_time >= '2018-01-01 00:00:00'
AND o.pay_time <= '2018-12-31 23:59:59'
AND c.cust_id IN (
SELECT DISTINCT
cust_id
FROM
t_customer_pool
WHERE
create_time >= '2018-01-01 00:00:00'
AND create_time <= '2018-12-31 23:59:59'
)
GROUP BY
c.cust_id;
复制代码
问题:测试
按照存在的问题,去修改,得出错误例子 V2.0spa
SELECT
c.cust_id "客户ID",
c.cust_name "客户名称",
sum(o.amount) "交易金额"
FROM
t_customer c
LEFT JOIN t_order o ON o.cust_id = c.cust_id
AND o.pay_time >= '2018-01-01 00:00:00'
AND o.pay_time <= '2018-12-31 23:59:59'
WHERE
c.cust_id IN (
SELECT DISTINCT
cust_id
FROM
t_customer_pool
WHERE
create_time >= '2018-01-01 00:00:00'
AND create_time <= '2018-12-31 23:59:59'
)
GROUP BY
c.cust_id;
复制代码
备注3d
- left join某个表后,该表的筛选条件不要写在where条件后面,否则left join 会变成 inner join
- 信心满满把这条SQL交给DBA执行(测试环境验证经过),结果DBA说SQL执行了很长时间没得出结果,只能kill掉
- 线上环境的数据量是测试环境的几十倍,数据量一上来,隐藏问题就被放大了
问题:code
SELECT
c.cust_id "客户ID",
c.cust_name "客户名称",
sum(o.amount) "交易金额"
FROM
t_customer c
LEFT JOIN (
SELECT
order_id,
amount,
cust_id
FROM
t_order
WHERE
pay_time >= '2018-01-01 00:00:00'
AND pay_time <= '2018-12-31 23:59:59'
) o ON o.cust_id = c.cust_id
WHERE
c.cust_id IN (
SELECT DISTINCT
cust_id
FROM
t_customer_pool
WHERE
create_time >= '2018-01-01 00:00:00'
AND create_time <= '2018-12-31 23:59:59'
)
GROUP BY
c.cust_id
ORDER BY
NULL;
复制代码
若是你们有更好的方法,欢迎在文章下面评论cdn