Как рассчитать данные покупателя, у которого было особое условие mysql - PullRequest
0 голосов
/ 20 января 2020

У меня есть данные покупателя в таблице под названием order_star_member , в этой таблице содержится создал в . в этой строке указана дата транзакции, users_id содержит покупателя, а total_price_star_member - сумма транзакции каждого покупателя, поэтому я хочу подсчитать сумму покупателя, совершившего транзакцию> = 600000 в январе, а затем снова выполняю транзакцию в феврале 2020 года для> = 600000, я попытался вставить новую таблицу для самого января и для самого февраля, но это просто трата времени, знаете ли вы, какой точный синтаксис для решения этой проблемы? Я пробовал этот синтаксис, но я не знаю, почему результат был 0, а когда я проверяю руководство, ответ - 5 покупатель, который делает транзакцию в январе для транзакции> = 600000, а также в феврале> = 600000

select count(*) from (SELECT 
    b.users_id
FROM order_star_member b
WHERE
    EXISTS (SELECT 1 FROM order_star_member d
            WHERE d.users_id = b.users_id AND
                  d.createdAt >= '2019-12-01' AND d.createdAt < '2020-01-01') AND
    EXISTS (SELECT 1 FROM order_star_member c
            WHERE c.users_id = b.users_id AND
                  d.createdAt >= '2020-01-01' AND d.createdAt < '2020-02-01') AND
    NOT EXISTS (SELECT 1 FROM order_star_member e
                WHERE e.users_id = b.users_id AND d.createdAt < '2019-12-01') group by users_id having sum(total_price_star_member) >= 600000) inner_query;

пример данных:

январь

  • A (транзакция 100000)
  • A (транзакция 100000)
  • B (транзакция 150000)
  • B (транзакция 600000)

Февраль

  • A (транзакция 500000)
  • C (транзакция 600000)
  • B (транзакция 750000)

Ожидаемый результат после выполнения синтаксиса

  • количество покупателей, совершивших транзакцию> = 600000 в январь и февраль: 1 (покупатель B)

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Если вы хотите, чтобы пользователи, чья сумма транзакций превышала 600 000 в каждом январе и феврале, вы можете использовать два уровня агрегирования:

select user_id
from (select osm.user_id, month(osm.createdAt) as mon,
             sum(osm.price) as total_price
      from order_star_member osm
      where osm.createdAt >= '2020-01-01' and
            osm.createdAt < '2020-03-01'
      group by osm.user_id, month(osm.createdAt)
     ) um
where total_price >= 600000
group by user_id
having count(*) = 2;
1 голос
/ 20 января 2020

Причина, по которой вы не получаете 5, в том, что ссылки на псевдонимы таблиц неверны (замена d на c и e)

select count(*) from 
  (SELECT b.users_id FROM order_star_member b WHERE 
        EXISTS (SELECT 1 FROM order_star_member d 
                WHERE d.users_id = b.users_id AND 
                d.createdAt >= '2019-12-01' AND
                d.createdAt < '2020-01-01')
        AND EXISTS (SELECT 1 FROM order_star_member c 
                WHERE c.users_id = b.users_id AND
                c.createdAt >= '2020-01-01' AND 
                c.createdAt < '2020-02-01') 
        AND NOT EXISTS (SELECT 1 FROM order_star_member e
                WHERE e.users_id = b.users_id AND
                e.createdAt < '2019-12-01') 
   group by b.users_id having
   sum(b.total_price_star_member) >= 600000) inner_query;

Я бы работал в другой группе по уровням, чтобы справиться с группировкой по месяц.

...