包括和排除特定记录
Including and excluding specific records
我想找一些有特殊情况的买家(在这种情况下,交易> = 600000称为明星会员)
本例想找出2020年1月和2020年3月存在的star会员(交易>=600000),但不包括2020年2月正在交易的star会员。
这是我的语法
SELECT users_id
FROM order_star_member
GROUP BY users_id
HAVING SUM(CASE WHEN MONTHNAME(createdAt) = 'January'
THEN total_price_star_member END) >= 600000
AND SUM(CASE WHEN MONTHNAME(createdAt) = 'March'
THEN total_price_star_member END) >= 600000
AND NOT EXISTS (SELECT 1 FROM order_star_member
GROUP BY users_id
having sum(case when monthname(createdAt) = 'February'
THEN total_price_star_member END) >= 600000);
这是我的 fiddle
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=2c85037215fe71f700b51c8fd3a5ae76
在我的 fiddle 上,预期结果是 users_Id 15,因为该 id 顺序在一月和三月而不是在二月
首先在里面t
我们按月分组确定所有的star成员
外部分组按 user_id 分组。他们的分数是 star_member.
的总和
对于二月(下面查询的第一行中的 m=2(二月是第二个月))如果它们是 star_member,它们将得到一个任意值的惩罚 (-100) SUM
无法克服。
如果用户的 star_member 在 1 月和 3 月都为真 (1) 而不是 2 月,则 month_score=2
可以存在的唯一方法。
SELECT users_id, SUM(IF(m=2 and star_member, -100, star_member)) as month_score
FROM
(SELECT users_id,
MONTH(createdAt) as m,
SUM(total_price_star_member) >= 600000 as star_member
FROM order_star_member
WHERE createdAt BETWEEN '20190101' AND '20190331'
GROUP BY users_id, m
) t
GROUP BY users_id
HAVING month_score=2
我想找一些有特殊情况的买家(在这种情况下,交易> = 600000称为明星会员)
本例想找出2020年1月和2020年3月存在的star会员(交易>=600000),但不包括2020年2月正在交易的star会员。
这是我的语法
SELECT users_id
FROM order_star_member
GROUP BY users_id
HAVING SUM(CASE WHEN MONTHNAME(createdAt) = 'January'
THEN total_price_star_member END) >= 600000
AND SUM(CASE WHEN MONTHNAME(createdAt) = 'March'
THEN total_price_star_member END) >= 600000
AND NOT EXISTS (SELECT 1 FROM order_star_member
GROUP BY users_id
having sum(case when monthname(createdAt) = 'February'
THEN total_price_star_member END) >= 600000);
这是我的 fiddle
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=2c85037215fe71f700b51c8fd3a5ae76
在我的 fiddle 上,预期结果是 users_Id 15,因为该 id 顺序在一月和三月而不是在二月
首先在里面t
我们按月分组确定所有的star成员
外部分组按 user_id 分组。他们的分数是 star_member.
的总和对于二月(下面查询的第一行中的 m=2(二月是第二个月))如果它们是 star_member,它们将得到一个任意值的惩罚 (-100) SUM
无法克服。
如果用户的 star_member 在 1 月和 3 月都为真 (1) 而不是 2 月,则 month_score=2
可以存在的唯一方法。
SELECT users_id, SUM(IF(m=2 and star_member, -100, star_member)) as month_score
FROM
(SELECT users_id,
MONTH(createdAt) as m,
SUM(total_price_star_member) >= 600000 as star_member
FROM order_star_member
WHERE createdAt BETWEEN '20190101' AND '20190331'
GROUP BY users_id, m
) t
GROUP BY users_id
HAVING month_score=2