Обратитесь за помощью в создании сводного запроса, работающего с динамическим диапазоном дат - PullRequest
0 голосов
/ 05 июля 2018

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

 SELECT TRUNC(to_date('08-Jul-2018', 'dd-Mon-yyyy'), 'IW') 
      + Level - (1+ TRUNC(to_date('08-Jul-2018', 'dd-Mon-yyyy'), 'IW') 
      - TRUNC(to_date('08-Jul-2018', 'dd-Mon-yyyy'), 'IW'))
   FROM dual
CONNECT BY level <= 8; --great

Query two - это сводный запрос, который сейчас отлично работает с жестко закодированными датами. Как я могу вместо этого сделать динамическую точку (сумму (число) для ввода в (.....)) динамической? Вы видите, в настоящее время это жестко закодировано. спасибо

WITH tbl AS
  ( SELECT DISTINCT rowlabel,
    TO_CHAR(insrt ,'mm-dd-yyyy'),
    counts
  FROM tbl
  WHERE TRUNC(insrt) >= to_date('01-01-1900', 'MM-DD-YYYY')
  AND TRUNC(insrt)   <= to_date('12-31-4000', 'MM-DD-YYYY')
  )

SELECT                                             *
FROM tbl pivot ( 
  SUM(counts) FOR insrt IN ('06-30-2018','07-01-2018','07-02-2018','07-03-2018',
                            '07-04-2018','07-05-2018','07-06-2018')
) ;

1 Ответ

0 голосов
/ 06 июля 2018
select trunc(to_date('04-JUL-2018', 'dd-Mon-yyyy'), 'IW') + level -1
from dual
connect by level < 7;
--Query 2
WITH t AS
  ( SELECT DISTINCT test_number,
    TO_CHAR(insrt_dttm,'mm-dd-yyyy') AS date_without_time,
    rec_cnt
  from cdw_t.data_monitoring_result
  WHERE TRUNC(insrt_dttm) >= to_date('01-01-1900', 'MM-DD-YYYY')
  AND TRUNC(insrt_dttm)   <= to_date('12-31-4000', 'MM-DD-YYYY')
  )

SELECT                                             *
FROM t pivot ( SUM(rec_cnt) FOR date_without_time IN ('06-30-2018','07-01-2018','07-02-2018','07-03-2018','07-04-2018','07-05-2018','07-06-2018')) ;
TEST_NUMBER '06-30-2018'    '07-01-2018'    '07-02-2018'    '07-03-2018'    '07-04-2018'    '07-05-2018'    '07-06-2018'
51  10  10  10  11  14  14  14                  
1   179 179 179 179 179 179 179
30  127 127 127 127 127 127 127
53  594 594 594 594 594 594 226

Above is the sample output.  I was hoping that maybe I can use query 1 replace the hard coded dates in the FOR statement brackets.   I don't know how to write PL/SQL and not sure if it is possible to have a dynamic range inside the pivot for statement.  
...