У меня есть 1 таблица с именем order_star_member, в которой в качестве даты транзакции указывается createAt, в качестве покупателя - users_id, в качестве суммы транзакции - total_price_star_member. В этом случае я хочу найти покупателя, у которого был звездный участник (транзакция за месяц в пределах> = 600000), и выяснить, откуда они поступают, данные (фиктивные) для order_star_member начинаются с января 2019 года по март 2019
CREATE TABLE order_star_member ( users_id INT,
createdAt DATE,
total_price_star_member DECIMAL(10,2) );
INSERT INTO order_star_member VALUES
(12,'2019-01-01',100000),
(12,'2019-01-10',100000),
(12,'2019-01-20',100000),
(12,'2019-02-10',100000),
(12,'2019-02-15',300000),
(12,'2019-02-21',500000),
(13,'2019-01-02',900000),
(13,'2019-01-11',300000),
(13,'2019-01-18',400000),
(13,'2019-02-06',100000),
(13,'2019-02-08',900000),
(13,'2019-02-14',400000),
(14,'2019-01-21',500000),
(14,'2019-01-23',200000),
(14,'2019-01-24',300000),
(14,'2019-02-08',100000),
(14,'2019-02-09',200000),
(14,'2019-02-14',100000),
(15, '2019-03-04',1000000),
(14, '2019-03-04', 300000),
(14, '2019-03-04', 350000),
(13, '2019-03-04', 400000),
(15, '2019-01-23', 620000),
(15, '2019-02-01', 650000),
(12, '2019-03-03', 750000),
(16, '2019-03-04', 650000),
(17, '2019-03-03', 670000),
(18, '2019-02-02', 450000),
(19, '2019-03-03', 750000);
SELECT * from order_star_member;
и затем я суммирую данные за месяц
-- summary per-month data
SELECT users_id,
SUM( CASE WHEN MONTHNAME(createdAt) = 'January'
THEN total_price_star_member
END ) total_price_star_member_January,
SUM( CASE WHEN MONTHNAME(createdAt) = 'February'
THEN total_price_star_member
END ) total_price_star_member_February,
SUM( CASE WHEN MONTHNAME(createdAt) = 'March'
THEN total_price_star_member
END ) total_price_star_member_March
FROM order_star_member
GROUP BY users_id
ORDER BY 1;
. В этом случае я хочу узнать распределение для каждого звездного члена (users_id, кто транзакция> = 600000 в месяц) в марте и где users_Id выполняет свою транзакцию> = 600.000 до марша (если users_Id выполняет транзакцию в первый раз в марте, то users_Id вводит марш для марша statisti c)
expected results for star member on month march statistics
+-------------------+------+-------+
| count star_member | year | month |
+-------------------+------+-------+
| 2 | 2019 | 1 |
| 1 | 2019 | 2 |
| 3 | 2019 | 3 |
+-------------------+------+-------+
объяснение: есть 2 users_Id who станьте star_member в марте (users_Id 14,15) и станьте его первым star_member в январе 2019 года, есть 1 users_id, который станет star_member в марте (users_id 12) и станет его первым star_member в феврале 2019 года, и есть 3 users_id, которые станут star_member в марте ( users_id 16, 17, 19) и стать его первым star_member марта 2019 * 10 10 *
это мой синтаксис прогресса
select count(osm.users_id) as count_buyer, year(osm.createdAt) as year,
month(osm.createdAt) as month
from order_star_member osm
WHERE osm.createdAt >= MAKEDATE(YEAR(osm.createdAt), 1)
+ INTERVAL month(osm.createdAt) month- INTERVAL 1 month AND
osm.createdAt <= MAKEDATE(YEAR(osm.createdAt), 1)
+ INTERVAL month(osm.createdAt) month- INTERVAL 1 day group by users_Id
having sum(total_price_star_member) >= 600000
AND
NOT EXISTS (SELECT 1 from order_star_member osm2
WHERE osm2.users_id = osm.users_id
AND osm2.createdAt < MAKEDATE(YEAR(osm.createdAt), 1) +
INTERVAL month(osm.createdAt) month - INTERVAL 1 month
group by users_id
having sum(total_price_star_member) >= 600000)
AND
EXISTS (SELECT 1 from order_star_member osm3
where
osm3.users_id = osm.users_id AND
osm3.createdAt >= '2019-03-01' AND
osm3.createdAt < '2019-04-01' group by users_id
having sum(total_price_star_member) >= 600000)
group by year(osm.createdAt), month(osm.createdAt);
вот скрипка https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=d642774357900f967d7af9659d8639d7