Получить данные за последние 12 недель оракул - PullRequest
0 голосов
/ 15 мая 2018

Здравствуйте, мне нужно получить количество транзакций и общую сумму транзакций за последний квартал. я использую следующее, чтобы получить данные за квартал (последние 90 дней)

WITH date_range as
(SELECT TRUNC(sysdate) - 90 + level AS week_day
FROM dual
CONNECT BY ROWNUM <= 90),
     the_data
  AS (SELECT TRUNC(systemdate)  AS log_date, count(*) AS num_obj,status AS log_status, nvl(sum(
        CASE
          WHEN VERSION = '1.1'
          THEN nvl(amount/100,'0.0')
          ELSE nvl(amount,'0.0')
        END), 0) AS totalamount
        from transactionlog where ((merchantcode in (
  SELECT regexp_substr('MERC0003','[^,]+', 1, LEVEL) FROM dual
  connect by regexp_substr('MERC0003', '[^,]+', 1, level) is not null ) OR 'MERC0003' IS NULL)  AND status  = 'xxxx')
      GROUP BY TRUNC(systemdate),status)   
SELECT TO_CHAR(dr.week_day,'DD/MM/YYYY HH:MI AM') AS TXNDATE, NVL(trans_log.num_obj,0) as TXNCOUNT,trans_log.log_status,trans_log.totalamount
FROM date_range dr LEFT OUTER JOIN the_data  trans_log
     on trans_log.log_date =  dr.week_day
ORDER BY dr.week_day DESC ;  

Сверху я получаю запись за 90 дней, как в 90 строках, содержащих количество транзакций и сумму за 90 дней, мне нужно получить данные с точки зрения недель в квартале. То есть 12 строк, содержащих данные за каждую неделю, в которой указаны количество транзакций и сумма за последние 12 недель.

1 Ответ

0 голосов
/ 15 мая 2018

Вы можете использовать TRUNC( date_value ,'IW' ), чтобы усечь дату до начала недели ISO (понедельник 00:00), добавить кратные значения недели в диапазоне дат и выполнить такое же усечение в своем запросе:

WITH date_range( week_day ) as (
  SELECT TRUNC( sysdate  - 90, 'IW' ) + ( level - 1 ) * INTERVAL '7' DAY
  FROM   dual
  CONNECT BY TRUNC( sysdate  - 90, 'IW' ) + ( level - 1 ) * INTERVAL '7' DAY <= SYSDATE
),
the_data ( log_date, num_obj, log_status, totalamount ) AS (
  SELECT TRUNC(systemdate, 'IW'),
         -- rest of your query
  GROUP BY TRUNC(systemdate, 'IW'),
       status
)   
SELECT *
FROM   date_range dr
       LEFT OUTER JOIN the_data  trans_log
       on trans_log.log_date = dr.week_day
ORDER BY dr.week_day DESC; 
...