包括和排除特定记录

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

fiddle