Включая и исключая указанные c записи - PullRequest
0 голосов
/ 18 февраля 2020

Я хочу найти покупателя, у которого было особое условие (в данном случае транзакция> = 600000 называется звездным членом)

В этом случае я хочу найти звездного участника (транзакция> = 600000) который существует в январе 2020 и марте 2020 года, но не включает звездного участника, который совершает транзакцию в феврале 2020 года.

вот мой синтаксис

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);

и вот моя скрипка

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=2c85037215fe71f700b51c8fd3a5ae76

на моей скрипке ожидаемый результат - users_Id 15, потому что этот порядок идентификаторов в январе и марте, но не в феврале

1 Ответ

1 голос
/ 18 февраля 2020

Сначала во внутреннем t мы группируем по месяцам, чтобы определить всех звездных членов.

Внешние группировки групп по user_id. Их оценка равна сумме их star_member.

Для февраля (m = 2 (февраль - второй месяц) в первой строке запроса ниже), если они являются star_member, они получают штраф (-100 ) как произвольное значение, которое SUM не может преодолеть.

Единственный способ, которым month_score=2 может существовать, если пользователь имеет значение star_member, равное true (1) для января и марта, но не для февраля.

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

скрипка

...