我有1个表,称为order_star_member,其中包含createdAt作为交易日期,users_id作为买方,total_price_star_member作为交易金额。在这种情况下,我想找出拥有星级会员的买家(一个月内交易=> 600000以内),并找出他们来自哪里,order_star_member的数据(虚拟)始于2019年1月,直到2019年3月1日
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', 900000),
(15, '2019-01-23', 620000),
(15, '2019-02-01', 650000),
(12, '2019-03-03', 750000),
(16, '2019-03-04', 650000);
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 | total_price_star_member_january | total_price_star_member_february | total_price_star_member_March |
+----------+---------------------------------+----------------------------------+-------------------------------+
| 12 | 300000 | 900000 | 750000 |
| 13 | 1600000 | 1400000 | 900000 |
| 14 | 1000000 | 400000 | 650000 |
| 15 | 620000 | 650000 | 1000000 |
| 16 | null | null | 650000 |
+----------+---------------------------------+----------------------------------+-------------------------------+
在这种情况下,我想找出三月中每个明星成员(一个月内交易> = 600000的users_id)以及三月前进行交易的users_Id> = 600.000的分布(如果users_Id在第一次进行交易)进行中的时间,然后users_Id输入进行中的进行统计)
expected results for star member on month march statistics
+-------------------+------+-------+
| count star_member | year | month |
+-------------------+------+-------+
| 3 | 2019 | 1 |
| 1 | 2019 | 2 |
| 1 | 2019 | 3 |
+-------------------+------+-------+
说明:3月中有3个users_Id成为star_member(users_Id 13,14,15)并于2019年1月成为他的第一个star_member,有1个users_id在3月(users_id 12)成为star_member,并在2019年2月成为他的第一个star_member,并且有1个users_id在3月成为star_member(users_id 16)并在2019年3月成为他的第一个star_member]
到目前为止,这是我的进度语法
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_8.0&fiddle=65446aec0e7f28ffdc2f235008de30ef
我有1个表,称为order_star_member,其中包含createdAt作为交易日期,users_id作为买方,total_price_star_member作为交易金额。在这种情况下,我想...
WITH
cte1 AS ( SELECT DISTINCT
users_id,
DATE_FORMAT(createdAt, '%Y%m') year_and_month,
SUM(total_price_star_member) OVER (PARTITION BY users_id, DATE_FORMAT(createdAt, '%Y%m')) month_price
FROM order_star_member ),
cte2 AS ( SELECT users_id, MIN(year_and_month) year_and_month
FROM cte1
WHERE month_price >= 600000
GROUP BY users_id )
SELECT COUNT(users_id) count_star_member,
year_and_month DIV 100 `year`,
year_and_month MOD 100 `month`
FROM cte2
GROUP BY year_and_month
ORDER BY `year`, `month`;