【问题标题】:how to count with more than 1 having clause mysql如何计算超过 1 个有子句 mysql
【发布时间】:2020-06-15 09:51:39
【问题描述】:

我有 1 个名为 order_star_member 的表,其中包含 createdAt 作为交易日期,users_id 作为买家,total_price_star_member 作为交易金额。在这种情况下,我想找出拥有明星会员的买家(一个月内的交易> = 600000)并找出他们来自哪里,order_star_member 的数据(虚拟)从 2019 年 1 月到 2019 年 3 月开始

    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;

在这种情况下,我想找出三月份每个明星成员的分布情况(一个月内交易的用户 ID >= 600000),以及三月份之前进行交易的用户 ID >= 600.000(如果用户 ID 在第一次在三月,然后users_Id进入三月到三月统计)

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 在 3 月成为 star_member (users_Id 14,15) 并在 2019 年 1 月成为他的第一个 star_member, 有 1 个 users_id 在 3 月成为 star_member(users_id 12)并在 2019 年 2 月成为他的第一个 star_member, 并且有 3 个 users_id 在 3 月成为 star_member(users_id 16、17、19)并在 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_5.7&fiddle=d642774357900f967d7af9659d8639d7

【问题讨论】:

  • 我忘了编辑解释,对不起,我刚刚编辑了它
  • 嗯...users_id=13 没有被计算在内,因为他没有在 3 月份出演???
  • 是的,因为我想在 3 月份进行统计,并且 users_id 13 没有被计算在内,因为他们不是 3 月份的明星会员(交易 >= 600000)

标签: mysql mysql-workbench mysql-error-1064


【解决方案1】:
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`;

fiddle


您的 MySQL 服务器版本是多少? ——秋名

这是 5.7.23-log – Fachry Dzaky Al-Qadri Sabil

SELECT COUNT(users_id) count_star_member,
       year_and_month DIV 100 `year`,
       year_and_month MOD 100 `month`
FROM (SELECT users_id, 
             MIN(year_and_month) year_and_month
      FROM ( SELECT users_id, 
                    DATE_FORMAT(createdAt, '%Y%m') year_and_month,
                    SUM(total_price_star_member) month_price
             FROM order_star_member
             GROUP BY users_id, 
                      DATE_FORMAT(createdAt, '%Y%m') 
             HAVING month_price >= 600000 ) starrings
      GROUP BY users_id ) first_starrings
GROUP BY year_and_month
ORDER BY `year`, `month`;

fiddle


明星会员3月统计的预期结果

...

嗯... users_id=13 没有被计算在内,因为他没有在 3 月份出演??? ——秋名

是的,因为我想在 3 月份进行统计,而 users_id 13 没有被计算在内,因为他们不是 3 月份的明星会员(交易 >= 600000)– Fachry Dzaky Al-Qadri Sabil

据我了解,该统计数据中统计的用户必须在本月加注星标。如果是这样

SELECT COUNT(users_id) count_star_member,
       year_and_month DIV 100 `year`,
       year_and_month MOD 100 `month`
FROM (SELECT users_id, 
             MIN(year_and_month) year_and_month
      FROM ( SELECT users_id, 
                    DATE_FORMAT(createdAt, '%Y%m') year_and_month,
                    SUM(total_price_star_member) month_price
             FROM order_star_member
             GROUP BY users_id, 
                      DATE_FORMAT(createdAt, '%Y%m') 
             HAVING month_price >= 600000 ) starrings
      GROUP BY users_id
      HAVING SUM(year_and_month = '201903') > 0 ) first_starrings
GROUP BY year_and_month
ORDER BY `year`, `month`;

fiddle

【讨论】:

  • 我确定你是 mysql 的专业人士啊哈哈因为我不明白你的代码是什么,让我学习一下,让我困惑的是预期结果是 3 月份的统计数据,如果我想找到怎么办取出 2 月的统计数据(基于数据虚拟),因此结果是 2019 年第 1 个月的 2 个,以及 2019 年第 2 个月的 1 个
  • @FachryDzakyAl-QadriSabil 我不明白你的代码是什么 看看小提琴——我得到了一些解释。尝试部分执行它(WITH cte1 AS (...) SELECT * FROM cte1,然后是WITH cte1 AS (...), cte2 AS (...) SELECT * FROM cte2)并比较评论和结果。 fiddle.
  • @FachryDzakyAl-QadriSabil 如果我想找出 2 月份的统计数据怎么办(基于数据虚拟) 根据 WHERE 添加到 cte1,删除上面的所有记录感兴趣的月份。
  • @FachryDzakyAl-QadriSabil ???你的 MySQL 服务器版本是多少?
  • @FachryDzakyAl-QadriSabil ???如果是这样,为什么您发布小提琴使用 MySQL 版本 8 ???我的解决方案不适用于版本 5+。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
相关资源
最近更新 更多