Получить все месяцы между двумя датами с подсчетом из таблицы в MySql - PullRequest
0 голосов
/ 28 июня 2019

Я написал запрос на получение всего месяца между двумя днями с количеством участников в качестве числа, но не смог получить весь месяц.

SET @start_date = '2017-08-31'; 
SET @end_date = '2018-06-26'; 
SELECT COUNT(1) AS Y, DATE_FORMAT(created_date,'%b %y') AS X 
FROM members m 
WHERE 
    created_date >= @start_date AND 
    created_date <= @end_date 
GROUP BY X 
ORDER BY X;

После вывода я получаю

1   Feb 18
1   Mar 18
1   Nov 17
2   Oct 17

Но ожидаемый результат будет

2 Oct 17
1 Nov 17
0 Dec 17
0 Jan 18
1 Feb 18
1 Mar 18

Онлайн-запрос ССЫЛКА

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Выполните следующий SQL-запрос, чтобы получить желаемый результат: выберите EXTRACT (ГОД ИЗ СОЗДАНО_ДАТЫ) КАК ГОД, ВЫПИСАТЬ (МЕСЯЦ ОТ СОЗДАНО_ДАТА) КАК МЕСЯЦ, СЧЕТ (1) из членов GROUP BY YEAR, MONTH

Заметил, что вы также применили сортировку, любезно сделайте то же самое, что вам нужно, она получит счет с номером года и месяца.

См. Следующую ссылку для получения дополнительной информации о функции извлечения: https://www.w3schools.com/sql/func_mysql_extract.asp

0 голосов
/ 28 июня 2019

Вам нужна «контрольная» таблица для всех месяцев, которые вы пытаетесь включить. Это можно сделать с помощью таблицы «календарь» или путем включения записей в качестве «заполнителей» для всех месяцев в таблицу «члены».

Есть лучший способ сделать это, но, например, вот идея (используя данные из вашей ССЫЛКИ выше)

    CREATE TABLE members
(
    member_id INT,
    name VARCHAR(100),
    created_date DATE
);

INSERT INTO members (member_id, name, created_date) VALUES (1, 'Anand Jee', '2017/10/10');
INSERT INTO members (member_id, name, created_date) VALUES (2, 'Anil', '2017/11/21');
INSERT INTO members (member_id, name, created_date) VALUES (3, 'Saurav', '2018/2/10');
INSERT INTO members (member_id, name, created_date) VALUES (4, 'Amit', '2018/3/10');
INSERT INTO members (member_id, name, created_date) VALUES (5, 'Nilesh', '2018/7/17');
INSERT INTO members (member_id, name, created_date) VALUES (6, 'Nitesh', '2018/9/19');
INSERT INTO members (member_id, name, created_date) VALUES (7, 'Ajay', '2019/2/21');
INSERT INTO members (member_id, name, created_date) VALUES (8, 'Rahul', '2019/3/30');
INSERT INTO members (member_id, name, created_date) VALUES (9, 'Sumit', '2019/7/17');
INSERT INTO members (member_id, name, created_date) VALUES (10, 'Gautam', '2017/10/21');

INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2017/08/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2017/09/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2017/10/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2017/11/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2017/12/1');

INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2018/1/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2018/2/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2018/3/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2018/4/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2018/5/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2018/6/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2018/7/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2018/8/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2018/9/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2018/10/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2018/11/1');
INSERT INTO members (member_id, name, created_date) VALUES (-1, 'ZERO', '2018/12/1');

SET @start_date = '2017-08-31';
SET @end_date = '2018-06-26';
SELECT COUNT(1)-1 AS Y, DATE_FORMAT(created_date,'%b %y') AS X,DATE_FORMAT(created_date,'%y%m') AS Z
FROM members m
WHERE
created_date >= @start_date AND
created_date <= @end_date
GROUP BY X,Z
ORDER BY Z
...