一 概述
当我需要统计条件计算然后去重实现数据查询的时候,我们就可以通过:count distinct case when等关键字实现逻辑查询。
二 使用过程
SET @start_time = '2022-10-18 00:00:00',
@end_time = '2022-10-19 23:59:59';
SELECT
concat( LEFT ( @start_time, 10 ), ( '至' ), LEFT ( @end_time, 10 ) ) AS '时间',
u.*,
l.*
FROM
(
SELECT
count( DISTINCT pl.uid ) AS '总下单用户数',-- 当前用户是第一次下单购买商品
count( DISTINCT pl.uid ) - count( DISTINCT pll.uid ) AS '新增下单用户数',
count( pl.id ) AS '总订单量',-- 当周成功下单数≥2的用户数
count( DISTINCT CASE WHEN pls.order_num > 1 THEN pl.uid END ) AS '当前周期复购用户数',-- 当前周期用户数/总下单用户数
count( DISTINCT CASE WHEN pls.order_num > 1 THEN pl.uid END ) / count( DISTINCT pl.uid ) AS '当前周期复购率',-- 最近的订单时间和实际支付时间之间的差值为14天以内
count( DISTINCT CASE WHEN TIMESTAMPDIFF( DAY, pll.pay_time,pl.pay_time ) <= 14 OR pls.order_num > 1 THEN pl.uid END ) AS '当前周期前14天复购用户数',
count( DISTINCT CASE WHEN TIMESTAMPDIFF( DAY, pll.pay_time,pl.pay_time ) <= 14 OR pls.order_num > 1 THEN pl.uid END) / count( DISTINCT pl.uid ) AS '当前周期前14天复购率',
round( sum( pl.real_money ) / 100 / count( pl.uid ), 2 ) AS '客单价'
FROM
(-- 查找支付时间在一定范围内的订单
SELECT
id,
uid,
pay_time,
real_money
FROM
print_loan
WHERE
is_refund = 0
AND STATUS IN ( 3, 4, 5, 6, 12, 8, 9 )
AND pay_time BETWEEN @start_time
AND @end_time
) pl
left JOIN (-- 查找一定时间范围内下单用户,以及下单支付的最大时间
SELECT
uid,
max(pay_time) pay_time
FROM
print_loan
WHERE
is_refund = 0
AND STATUS IN ( 3, 4, 5, 6, 12, 8, 9 )
AND pay_time < @start_time
GROUP BY
uid
) pll ON pl.uid = pll.uid
LEFT JOIN (
SELECT
id,
uid,
count( id ) AS order_num
FROM
print_loan
WHERE
is_refund = 0
AND STATUS IN ( 3, 4, 5, 6, 12, 8, 9 )
AND pay_time BETWEEN @start_time
AND @end_time
GROUP BY
uid
) pls ON pl.uid = pls.uid
) l,
( SELECT count( id ) AS '总登录用户数' FROM print_user WHERE active_time BETWEEN @start_time AND @end_time ) u
结果