任何人都可以帮助我理解SQL
中的这一行。
COALESCE
(
COUNT
(
DISTINCT (
CASE WHEN DATEDIFF(o.order_date,o.first_order_date) <= 30 AND DATEDIFF(o.order_date,o.first_order_date) > 0 AND DATE_FORMAT(o.first_order_date,'%Y-%m') < DATE_FORMAT(now()- INTERVAL 1 MONTH,'%Y-%m') AND o.status_id in (11,22,24)
THEN o.customer_id
END
)
),
0
) as '0-30 customer reorder'.
答案 0 :(得分:1)
首先,查看COALESCE(a,b)
表示如果a不为null,则返回else返回b。
第二部分是COUNT DISTINCT
,它将计算所有不同(不同)的值。
然后根据某些条件输出不同的CASE WHEN
。
所以这里的情况是,当你在first_order_date(datediff(o.order_date,o.first_order_date) <= 30
)之后o的order_date小于30时,order_date和first_order_date是不同的[严格说来是“如果order_date在first_order_date之后,但是我假设first_order_date必须在order_date之前(datediff(o.order_date,o.first_order_date) > 0
)并且你的first_order_date(严格地)早于一个月(date_format(o.first_order_date,'%Y-%m') <date_format(now()- interval 1 month,'%Y-%m')
)并且status_id在(11,22,24)({{1然后你把值放在o.customer_id(o.status_id in (11,22,24)
,我想否则它会为null)。
好的,所以现在你对它进行COUNT DISTINCT,这样你就可以计算所有不同的id,所以基本上你会计算所有验证上述所有条件的order_id。
最后,你在COUNT上做了一个COALESCE,所以如果没有符合你条件的行,它会返回0.编辑:这里我的意思是如果没有与你的情况相对应的行,那么你会做COUNT没有DISTINCT(NULL),所以为了避免问题,如果没有行与CASE WHEN条件相对应,他会将COALESCE返回0。
不确定我是否清楚。