Как заполнить пропущенные даты между пустыми записями? - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь заполнить даты между пустыми записями, но безуспешно.Пытался сделать метод множественного выбора, попытался присоединиться, но, похоже, я упускаю суть.Я хотел бы создать записи с отсутствующими датами, чтобы создать диаграмму из этого блока кода.Сначала я хотел бы заполнить даты «вручную», позже я реорганизую этот код и заменю этот метод на аргумент.

Может ли кто-нибудь помочь мне с этим выражением?

SELECT
    LOG_LAST AS "data",
    SUM(run_cnt) AS "Number of runs"

FROM

dual l
LEFT OUTER JOIN "LOG_STAT" stat ON
stat."LOG_LAST" = l."CLASS"

WHERE

new_class = '$arg[klasa]'



--SELECT to_date(TRUNC (SYSDATE - ROWNUM), 'DD-MM-YYYY'),
--0
 --FROM dual CONNECT BY ROWNUM < 366

GROUP BY
    LOG_LAST
ORDER BY

LOG_LAST

// Edit:

LOG_LAST - это просто столбец с датой (например, 25.04.2018 15:44:21), run_cnt - это столбец с простым числом, LOG_STAT - это таблица, содержащая LOG_LAST и run_cnt,new_class - это столбец с именем записи. Я хотел бы перечислить записи, даже если они не существуют.Например: у меня есть записи с датами 24-09-2018, 23-09-2018, 20-09-2018, 18-09-2018, и я хотел бы перечислить записи даже без имен и run_cnt, но для создания отсутствующихдаты в некотором периоде

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Это называется уплотнение данных .Из oracle doc Уплотнение данных для отчетности , Пример Уплотнение данных

with ls as
(
  select trunc(created) as day,object_type new_class, sum(1)  as total
  from user_objects  
  group by trunc(created),object_type
)
, all_dates(day) as
(
  select min(day) from ls
  union all
  select day + 1 from all_dates where day < (select max(day) from ls)
)
select d.day, nvl(ls.total,0),new_class
from all_dates d 
left join ls partition by (ls.new_class)  on ls.day = d.day
order by d.day;
0 голосов
/ 25 сентября 2018

То, что вы хотите, является более или менее:

select d.day, sum(ls.run_cnt)
from all_dates d
left join log_stat ls on trunc(ls.log_last) = d.day
where ls.new_class = :klasa
group by d.day
order by d.day;

Таблица all_dates в приведенном выше запросе должна содержать все даты, начиная с минимальной даты klasa log_last и заканчивая максимальной датой klasa log_last.Вы получаете эти даты с помощью рекурсивного запроса.

with ls as
(
  select trunc(log_last) as day, sum(run_cnt) as total
  from log_stat
  where new_class = :klasa
  group by trunc(log_last)
)
, all_dates(day) as
(
  select min(day) from ls
  union all
  select day + 1 from all_dates where day < (select max(day) from ls)
)
select d.day, ls.total
from all_dates d
left join ls on ls.day = d.day
order by d.day;
0 голосов
/ 25 сентября 2018

попробуйте заполнить isnull:

SELECT
case when   trim(LOG_LAST) is null then '01-01-2018' 
 else isnull(LOG_LAST,'01-01-2018')end AS data,
    SUM(isnull(run_cnt,0)) AS "Number of runs"

FROM

dual l
LEFT OUTER JOIN "LOG_STAT" stat ON
stat."LOG_LAST" = l."CLASS"

WHERE

new_class = '$arg[klasa]'



--SELECT to_date(TRUNC (SYSDATE - ROWNUM), 'DD-MM-YYYY'),
--0
 --FROM dual CONNECT BY ROWNUM < 366

GROUP BY
    LOG_LAST
ORDER BY

LOG_LAST
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...