Попытка зациклить запрос, чтобы получить ежемесячный счет - PullRequest
1 голос
/ 25 июня 2019

Мне нужно получить количество сотрудников, которые имели активное покрытие для каждого пакета, в месяц.Смотря на промежуток в 50 месяцев, поэтому не хочу запускать его 50 раз.Мне нужно количество людей с каждой посылкой в ​​последний день каждого месяца между этими датами

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

SELECT COUNT (DISTINCT t.employee_num)
       ,t.PACKAGE
FROM TTABLE2 t
WHERE '&AS_OF' BETWEEN t.from_date AND t.to_date
GROUP BY 
       t.PACKAGE
AS_OF_DATE  BENEFIT Employee_NUM    FROM_DATE   TO_DATE
2015-04-30  Life    000009595   2015-04-01  2015-12-31
2015-04-30  Health  000009595   2015-04-01  2016-03-31
2015-04-30  Life    000009983   2015-04-01  2015-12-31
2015-04-30  Life    000011066   2015-04-01  2015-12-31
2015-04-30  Health  000011066   2015-04-01  2016-03-31
2015-04-30  Life    000011093   2015-04-01  2015-12-31
2015-04-30  Health  000011093   2015-04-01  2016-03-31
2015-04-30  Life    000011100   2015-04-01  2015-12-31
2015-04-30  Health  000011100   2015-04-01  2016-03-31

1 Ответ

0 голосов
/ 25 июня 2019
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...