SQL подсчитывать данные с начала даты до текущего месяца / года - PullRequest
1 голос
/ 19 марта 2020

У меня есть данные клиентов с марта 2019 года по февраль 2020 года. Я подсчитываю общее количество электронных писем, которые использовались для покупки нашего билета, за которым следовал каждый месяц, и запрос, который я использовал, был

  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;

Результат что я хочу, прикреплено ниже. Там, где он всегда выбирает начало даты, а затем выбирает каждый месяц, тогда учитывается только общее количество писем.

EXPECTED RESULT

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Вы можете использовать оконные функции:

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;
0 голосов
/ 19 марта 2020

Если вы используете 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 должно быть помещено во внешний запрос

  • вы select ing COUNT(*) in the subquery, but it is not used in the outer query - I removed that column from the выберите `предложение

...