Вам нужно написать таблицу календаря , затем LEFT JOIN
таблицу календаря по таблице Original.
Вы можете использовать CTE recursive , чтобы написать календарь
- Пусть
MIN(dt_log)
будет fromDate, MAX(dt_log)
будет Todate
- используйте
CTE
, чтобы сделать это
как это.
WITH CTE(from_date, i, datediff,cd_user) AS
(
SELECT MIN(dt_log) from_date, 1 AS i, trunc(MAX(dt_log) - MIN(dt_log)) as datediff,cd_user
FROM t
GROUP BY cd_user
UNION ALL
SELECT from_date, i + 1, datediff,cd_user
FROM CTE
WHERE i <= datediff
), dates as (select i, from_date + i - 1 Dt,cd_user from CTE)
SELECT d.CD_USER,d.DT,SUM(coalesce(t.TIME_SPENT,0)) cost
FROM dates d
LEFT JOIN T t on t.CD_USER = d.CD_USER
AND d.Dt = t.dt_log
group by d.CD_USER,d.DT
ORDER BY d.CD_USER,d.DT
sqlfiddle: http://sqlfiddle.com/#!4/a461d/4
Вы также можете использовать connect by
, чтобы написать календарь
WITH CTE as (
SELECT cd_user,MIN(dt_log) FromDate,MAX(dt_log) ToDate
FROM T
GROUP BY cd_user
), calendar as
(
select DISTINCT cd_user,(FromDate+level-1) dt
from CTE
connect by level <=ToDate - FromDate + 1
)
select d.CD_USER,d.DT,SUM(coalesce(t.TIME_SPENT,0)) cost
from calendar d
LEFT JOIN T t on t.CD_USER = d.CD_USER
AND d.dt = t.dt_log
group by d.CD_USER,d.DT
ORDER BY d.CD_USER,d.DT
sqlfiddle: http://sqlfiddle.com/#!4/a461d/9