2015-07-17 4 views
-2

Ниже приводится код, который я написал, чтобы получить записиХотите получить сумму до даты за последние 30 дней

SELECT run_time, SUM(rec_cnt) reg_cnt FROM(
select run_time,rec_cnt from 
(select TO_DATE(TO_CHAR(LST_UPDT_TIME,'DD-MON-YYYY'),'DD-MON-YYYY') run_time,max(Running_Total) rec_cnt from (
SELECT 
    LST_UPDT_TIME, 
    (
    SELECT COUNT(*) 
    FROM DM_REG_SMRY T2 
    WHERE T2.LST_UPDT_TIME <= T1.LST_UPDT_TIME AND REG_STS_ID = 14 
    ) AS Running_Total 
FROM 
    DM_REG_SMRY T1 
    order by T1.LST_UPDT_TIME 
    ) 
    group by TO_DATE(TO_CHAR(LST_UPDT_TIME,'DD-MON-YYYY'),'DD-MON-YYYY') 
    order by TO_DATE(TO_CHAR(LST_UPDT_TIME,'DD-MON-YYYY'),'DD-MON-YYYY') 
    ) 
    UNION 
(SELECT TRUNC(SYSDATE+1 - ROWNUM) run_time , 0 as rec_cnt FROM DUAL CONNECT BY ROWNUM <= 30) 
)GROUP BY run_time 
ORDER BY run_time; 

я получил следующий вывод

18-06-2015 00:00 6 
19-06-2015 00:00 7 
20-06-2015 00:00 0 
21-06-2015 00:00 0 
22-06-2015 00:00 0 
23-06-2015 00:00 0 
24-06-2015 00:00 12 
25-06-2015 00:00 0 
26-06-2015 00:00 0 
27-06-2015 00:00 0 
28-06-2015 00:00 0 
29-06-2015 00:00 0 
30-06-2015 00:00 0 
01-07-2015 00:00 0 
02-07-2015 00:00 0 
03-07-2015 00:00 49 
04-07-2015 00:00 0 
05-07-2015 00:00 0 
06-07-2015 00:00 0 
07-07-2015 00:00 0 
08-07-2015 00:00 0 
09-07-2015 00:00 0 
10-07-2015 00:00 49 
11-07-2015 00:00 0 
12-07-2015 00:00 0 
13-07-2015 00:00 65 
14-07-2015 00:00 77 
15-07-2015 00:00 101 
16-07-2015 00:00 0 
17-07-2015 00:00 0 

Но я хочу последнее ненулевое значение для быть повторен для нулевого места

Пожалуйста, помогите

+0

'TO_DATE (TO_CHAR (LST_UPDT_TIME, 'DD-MON-YYYY'), 'DD-MON-YYYY')' полностью бессмысленно, если 'LST_UPDT_TIME' - столбец' DATE'. –

ответ

0

Я не уверен на 100%, но если я понимаю correc Вы хотите подсчитать количество строк в DM_REG_SMRY, накопленных за последние 30 дней (начиная с SYSDATE-(30-1) и заканчивая сегодня SYSDATE-(1-1)) и с REG_STS_ID=14. И вы хотите получить накопленный подсчет по дате.

Это означает, что если вы на DM_REG_SMRYREG_STS_ID=14):

6 rows on 18-06-2015 
1 row on 19-06-2015 
5 rows on 24-06-2015 
37 rows on 03-07-2016 
16 rows on 13-07-2015 
12 rows on 14-07-2015 
24 rows on 15-07-2015 

вы действительно хотите этот результат:

18-06-2015 00:00 6 
19-06-2015 00:00 7 
20-06-2015 00:00 7 
21-06-2015 00:00 7 
22-06-2015 00:00 7 
23-06-2015 00:00 7 
24-06-2015 00:00 12 
25-06-2015 00:00 12 
26-06-2015 00:00 12 
27-06-2015 00:00 12 
28-06-2015 00:00 12 
29-06-2015 00:00 12 
30-06-2015 00:00 12 
01-07-2015 00:00 12 
02-07-2015 00:00 12 
03-07-2015 00:00 49 
04-07-2015 00:00 49 
05-07-2015 00:00 49 
06-07-2015 00:00 49 
07-07-2015 00:00 49 
08-07-2015 00:00 49 
09-07-2015 00:00 49 
10-07-2015 00:00 49 
11-07-2015 00:00 49 
12-07-2015 00:00 49 
13-07-2015 00:00 65 
14-07-2015 00:00 77 
15-07-2015 00:00 101 
16-07-2015 00:00 101 
17-07-2015 00:00 101 

Если это то, что вы действительно хотите, то возможным решением является:

SELECT runtime, 
     (SELECT COUNT(*) 
     FROM DM_REG_SMRY 
      WHERE LST_UPDT_TIME >= TRUNC(SYSDATE - (30-1)) 
      AND LST_UPDT_TIME < (runtime+1) 
      AND REG_STS_ID = 14 
    ) reg_cnt 
    FROM 
     (
     SELECT TRUNC(SYSDATE - (LEVEL - 1)) runtime 
     FROM DUAL 
     CONNECT BY LEVEL <= 30 
    ) dates 
    ORDER BY runtime; 
+0

Спасибо, это именно то, что я хочу – sagar

Смежные вопросы