Возвращать результаты за все дни месяца, даже если нет данных - PullRequest
0 голосов
/ 04 мая 2020

У меня есть выборка, которая возвращает данные, установленные DATA. Пример: enter image description here

Как вы можете видеть на рисунке ниже, нет данных за дни: 20,21,22 ... 28

Я хотел бы привести эти строки с результатом NULL

Мой выбор прост, столбец даты содержит дату В день

SELECT * 
from rentabilidade_fundos 
where data BETWEEN '2020-04-01' AND '2020-04-31' 
order by data

Как мне нужно, чтобы выбор вернул: enter image description here

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Чтобы решить эту проблему, вам нужно сгенерировать все даты в нужный период времени. Затем вы можете join таблицу, из которой вам нужно запросить. Вот мое решение.

Попытка воспроизвести вашу таблицу и ее значения.

INSERT INTO rentabilidade_fundos (data, conservado, moderado, arrojado)
VALUES
    ('2020-04-01', 1, 1, 1),
    ('2020-04-02', 2, 2, 2),
    ('2020-04-03', 3, 3, 3),
    ('2020-04-15', 15, 15, 15),
    ('2020-04-21', 21, 21, 21),
    ('2020-04-25', 25, 25, 25),
    ('2020-04-29', 29, 29, 29),
    ('2020-04-30', 30, 30, 30);

Мои данные в таблице выглядят следующим образом.
rentabilidade_fundos table .

Чтобы извлечь все поля за последние 30 дней с начальной датой 2020-04-01, вы можете использовать запрос ниже.

set @i = -1;
set @stop = 29;

SELECT rf.id, x.date, rf.conservado, rf.moderado, rf.arrojado
FROM rentabilidade_fundos rf
RIGHT JOIN (
    SELECT DATE(ADDDATE('2020-04-01', INTERVAL @i:=@i+1 DAY)) AS date FROM rentabilidade_fundos
    HAVING @i < @stop
) x ON x.date = rf.data
ORDER BY x.date;

Окончательный результат будет таким, как показано ниже.
Окончательный результат

0 голосов
/ 04 мая 2020

Если вы используете MySQL 8.0, вы можете сгенерировать список дат с помощью рекурсивного запроса, а затем left join с таблицей:

with calendar as (
    select '2020-04-01' dt
    union all select dt + interval 1 day where dt < '2020-04-31' from calendar
)
select c.dt, t.fundo_conservador, t.fundo_moderado, t.fundo_arrojado
from calendar c
left join mytable t on t.data = c.dt

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

create table calendar(dt date primary key);
insert into calendar values ('2020-04-01')? ('2020-04-02'), ...;

Затем вы можете использовать их вместо производной таблицы, сгенерированной рекурсивным cte:

select c.dt, t.fundo_conservador, t.fundo_moderado, t.fundo_arrojado
from calendar c
left join mytable t on t.data = c.dt
where c.dt >= '2020-04-01' and c.dt < '2020-05-01'
...