SELECT d.as_of_date,
Benefit COUNT(DISTINCT employee_number)
FROM ttable2 t
JOIN (SELECT LAST_DAY(ADD_MONTHS(fd, LEVEL)) AS as_of_date
FROM (SELECT MIN(from_date) AS fd, MAX(to_date) AS td
FROM ttable2)
CONNECT BY LAST_DAY(ADD_MONTHS(fd, LEVEL)) < td) d ON
D.as_of_date BETWEEN t.from_date AND t.to_date
GROUP BY d.as_of_date, PACKAGE
Вы можете использовать синтаксис connect by
, чтобы сгенерировать серию последних дней в каждом месяце для соответствующего диапазона, а затем присоединить его к числу отдельных сотрудников:
SELECT as_of_date, package, COUNT(DISTINCT employee_num)
FROM ttable2 t
JOIN (SELECT LAST_DAY(ADD_MONTH(fd, LEVEL)) AS as_of_date
FROM (SELECT MIN(from_date) AS fd, MAX(to_date) AS td
FROM ttable2)
CONNECT BY LAST_DAY(ADD_MONTH(fd, LEVEL)) < td) d ON
s.as_of_date BETWEEN t.from_date AND t.to_date
GROUP BY as_of_date, pacakge