【问题标题】:SQL count data from beginning of the date till current month/year从日期开始到当前月/年的 SQL 计数数据
【发布时间】:2020-03-18 22:26:49
【问题描述】:

我有从 2019 年 3 月到 2020 年 2 月的客户数据。我正在计算用于购买我们机票的电子邮件总数,然后是每个月,我使用的查询是

  SELECT sub.monthNameYear,sub.monthName,count(*) from
 (SELECT DATE_FORMAT(`reservation_for`,'%Y-%m') as monthNameYear,DATE_FORMAT(`reservation_for`,'%M %Y') as monthName,
         email,
         COUNT(*) AS 'Count'
  FROM `tablename`
  GROUP BY email, DATE_FORMAT(`reservation_for`, '%Y-%m') 
           HAVING COUNT(*) > 1 
  ORDER BY DATE_FORMAT(`reservation_for`, '%Y-%m') ) as sub
GROUP BY sub.monthNameYear;

我想要的结果附在下面。它总是选择日期的开始,然后选择每个月,然后只计算电子邮件总数。

【问题讨论】:

    标签: mysql sql database group-by subquery


    【解决方案1】:

    如果您运行的是 MySQL 8.0,则可以进行窗口求和。从您现有的查询开始:

    SELECT 
        monthNameYear,
        monthName,
        SUM(COUNT(*)) OVER(ORDER BY monthNameYear) totalPurchase
    FROM (
        SELECT 
            DATE_FORMAT(`reservation_for`,'%Y-%m') monthNameYear,
            DATE_FORMAT(`reservation_for`,'%M %Y') monthName,
            email
        FROM `tablename`
        GROUP BY monthNameYear, monthName, email 
        HAVING COUNT(*) > 1 
    ) as sub
    GROUP BY monthNameYear, monthName
    ORDER BY monthNameYear;
    

    注意事项:

    • 始终枚举group by 子句中的所有非聚合列

    • order by 子句应放在外部查询中

    • 你是 selecting COUNT(*) in the subquery, but it is not used in the outer query - I removed that column from theselect` 子句

    【讨论】:

    • 我试图按照元素分组。但是我们计算的方式也给了我实际的预订数据。日期看起来也更清晰。
    【解决方案2】:

    你可以使用窗口函数:

    SELECT ed.monthNameYear, ed.monthName,        
           COUNT(*),
           SUM(COUNT(*)) OVER (ORDER BY ed.monthNameYear)
    FROM (SELECT DATE_FORMAT(`reservation_for`,'%Y-%m') as monthNameYear,
                 DATE_FORMAT(`reservation_for`, '%M %Y') as monthName, 
                 email,
                 COUNT(*) AS cnt
          FROM `tablename`
          GROUP BY email, DATE_FORMAT(`reservation_for`, '%Y-%m'),
                DATE_FORMAT(`reservation_for`,'%M %Y')
          HAVING COUNT(*) > 1 
         ) ed
    GROUP BY ed.monthNameYear, ed.monthName;
    

    【讨论】:

    • Gordon Linoff 您生成新列的方式作为计数也很有意义。但我正在寻找一个只能使用 php 调用的增量列。您的帮助意义重大。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多