2016-02-11 2 views
0

Je suis en train de faire (date1 - date2)/count (date1)oracle Soustraire 2 dates puis divisez par le nombre

SELECT TO_CHAR(TRUNC(submit_date, 'iw'), 'YYYY-MM-DD') TIMESTAMP 
    , (TO_CHAR((closed_date - submit_date),'dd/mm/yyyy')) 
              /count(closed_date) AVG 
    FROM t_oi_request_form rf 
    LEFT JOIN t_oi_requester_domain rd 
    ON rf.REQUEST_TYPE = rd.requester_domain_id 
    LEFT JOIN t_oi_report_type rt 
    ON rf.requestor_domain = rt.REPORT_TYPE_ID 
WHERE submit_date 
      between TO_DATE('2015-11-02 00:00:00', 'YYYY-MM-DD hh24:mi:ss') 
       AND TO_DATE('2016-02-08 00:00:00', 'YYYY-MM-DD hh24:mi:ss') 
GROUP BY TRUNC(submit_date, 'iw'), 
      (TO_CHAR((closed_date - submit_date),'dd/mm/yyyy')) 
               /count(closed_date) 
ORDER BY TRUNC(submit_date, 'iw') 

J'obtiens l'erreur Error in query: ORA-00933: SQL command not properly ended

Voici des exemples de données

SUBMIT_DATE | CLOSED_DATE 
--------------------------- 
    02-NOV-15 | 12-NOV-15 
    02-NOV-15 | 03-NOV-15 
    04-NOV-15 | 20-JAN-16 
    04-NOV-15 | 11-NOV-15 
    04-NOV-15 | 19-JAN-16 
    05-NOV-15 | 31-DEC-15 
    05-NOV-15 | 05-NOV-15 
    06-NOV-15 | 06-NOV-15 
    05-NOV-15 | 05-NOV-15 
    04-NOV-15 | 05-NOV-15 
    06-NOV-15 |  NULL 
    10-NOV-15 | 11-NOV-15 
    13-NOV-15 | 17-NOV-15 
    13-NOV-15 | 17-NOV-15 
    09-NOV-15 | 11-NOV-15 
    11-NOV-15 | 17-NOV-15 
    11-NOV-15 | 11-NOV-15 
    13-NOV-15 | 17-NOV-15 
    11-NOV-15 | 11-NOV-15 
    10-NOV-15 | 13-NOV-15 
    11-NOV-15 | 11-NOV-15 
    19-NOV-15 | 19-NOV-15 
    17-NOV-15 | 20-JAN-16 
    17-NOV-15 | 18-DEC-15 
    19-NOV-15 | 03-DEC-15 
    17-NOV-15 |  NULL 
    19-NOV-15 | 15-DEC-15 
    16-NOV-15 |  NULL 
    18-NOV-15 | 19-NOV-15 
    20-NOV-15 | 20-NOV-15 
    19-NOV-15 | 20-NOV-15 
    20-NOV-15 | 25-NOV-15 
    20-NOV-15 | 25-NOV-15 
    17-NOV-15 | 17-NOV-15 
    19-NOV-15 | 20-NOV-15 
    19-NOV-15 | 20-NOV-15 
    19-NOV-15 | 20-NOV-15 
    17-NOV-15 | 17-NOV-15 
    17-NOV-15 | 17-NOV-15 
    17-NOV-15 | 17-NOV-15 
    17-NOV-15 | 17-NOV-15 
    17-NOV-15 | 17-NOV-15 
    18-NOV-15 | 20-NOV-15 
    19-NOV-15 | 20-NOV-15 
    19-NOV-15 | 20-NOV-15 
    20-NOV-15 | 20-NOV-15 
    20-NOV-15 | 20-NOV-15 
    26-NOV-15 | 02-DEC-15 
    25-NOV-15 | 26-NOV-15 
    27-NOV-15 | 01-DEC-15 
    25-NOV-15 | 25-NOV-15 
    24-NOV-15 | 25-NOV-15 
    25-NOV-15 | 01-DEC-15 
    26-NOV-15 | 18-JAN-16 
    25-NOV-15 | 30-NOV-15 
    26-NOV-15 | 06-JAN-16 
    26-NOV-15 | 27-NOV-15 
    25-NOV-15 | 31-DEC-15 
    26-NOV-15 |  NULL 
    25-NOV-15 | 31-DEC-15 
    25-NOV-15 | 31-DEC-15 
    24-NOV-15 |  NULL 
    26-NOV-15 | 11-DEC-15 
    30-NOV-15 | 01-DEC-15 
    03-DEC-15 | 15-DEC-15 
    30-NOV-15 | 01-DEC-15 
    02-DEC-15 | 04-DEC-15 
    03-DEC-15 | 04-DEC-15 
    02-DEC-15 | 04-DEC-15 
    02-DEC-15 |  NULL 
    04-DEC-15 | 04-DEC-15 
    03-DEC-15 | 03-DEC-15 
    02-DEC-15 | 04-DEC-15 
    10-DEC-15 | 16-DEC-15 
    09-DEC-15 | 16-DEC-15 
    11-DEC-15 |  NULL 
    08-DEC-15 |  NULL 
    09-DEC-15 | 09-DEC-15 
    09-DEC-15 | 09-DEC-15 
    09-DEC-15 |  NULL 
    10-DEC-15 |  NULL 
    15-DEC-15 | 16-DEC-15 
    17-DEC-15 | 18-DEC-15 
    16-DEC-15 | 29-DEC-15 
    15-DEC-15 | 16-DEC-15 
    14-DEC-15 | 16-DEC-15 
    23-DEC-15 | 06-JAN-16 
    24-DEC-15 | 07-JAN-16 
    22-DEC-15 |  NULL 
    31-DEC-15 |  NULL 
    08-JAN-16 | 26-JAN-16 
    07-JAN-16 | 11-JAN-16 
    07-JAN-16 | 11-JAN-16 
    04-JAN-16 | 06-JAN-16 
    05-JAN-16 | 06-JAN-16 
    04-JAN-16 | 06-JAN-16 
    04-JAN-16 | 06-JAN-16 
    07-JAN-16 | 11-JAN-16 
    06-JAN-16 | 06-JAN-16 
    12-JAN-16 | 13-JAN-16 
    13-JAN-16 | 20-JAN-16 
    11-JAN-16 | 11-JAN-16 
    12-JAN-16 | 13-JAN-16 
    22-JAN-16 |  NULL 
    18-JAN-16 |  NULL 
    21-JAN-16 | 22-JAN-16 
    19-JAN-16 | 20-JAN-16 
    21-JAN-16 | 22-JAN-16 
    21-JAN-16 | 22-JAN-16 
    19-JAN-16 |  NULL 
    22-JAN-16 |  NULL 
    19-JAN-16 |  NULL 
    20-JAN-16 | 22-JAN-16 
    19-JAN-16 | 21-JAN-16 
    21-JAN-16 | 22-JAN-16 
    21-JAN-16 | 21-JAN-16 
    20-JAN-16 |  NULL 
    18-JAN-16 |  NULL 
    18-JAN-16 |  NULL 
    18-JAN-16 |  NULL 
    26-JAN-16 |  NULL 
    26-JAN-16 |  NULL 
    26-JAN-16 |  NULL 
    26-JAN-16 |  NULL 
    26-JAN-16 |  NULL 
    29-JAN-16 | 05-FEB-16 
    26-JAN-16 | 05-FEB-16 
    29-JAN-16 |  NULL 
    29-JAN-16 |  NULL 
    26-JAN-16 | 26-JAN-16 
    26-JAN-16 |  NULL 
    26-JAN-16 | 26-JAN-16 
    04-FEB-16 |  NULL 
    05-FEB-16 |  NULL 
    02-FEB-16 | 05-FEB-16 
    04-FEB-16 |  NULL 
    01-FEB-16 |  NULL 
    02-FEB-16 | 02-FEB-16 
    05-FEB-16 |  NULL 
    01-FEB-16 |  NULL 
    03-FEB-16 |  NULL 
    03-FEB-16 |  NULL 

J'essaie de calculer Moyenne ouverte de fermeture à jours (jours), je peux le faire mal

+0

À quelle table appartient la colonne submit_date? – jarlh

+0

ils appartiennent tous à 't_oi_request_form' – shorif2000

+0

J'envelopperais la plus grande partie dans une table dérivée, y compris les trucs to_char. Et effectuez le GROUP BY final au niveau du lop. – jarlh

Répondre

0

Je ne suis pas un gars oracle mais juste oeil Balling votre code que je peux voir entre parenthèses manquantes:

Vous avez:

SELECT TO_CHAR(TRUNC(submit_date, 'iw'), 'YYYY-MM-DD') TIMESTAMP 
,(TO_char((closed_date - submit_date),'dd/mm/yyyy'))/count(closed_date) AVG 


FROM t_oi_request_form rf 
LEFT JOIN t_oi_requester_domain rd ON rf.REQUEST_TYPE = rd.requester_domain_id 
LEFT JOIN t_oi_report_type rt ON rf.requestor_domain = rt.REPORT_TYPE_ID 
WHERE submit_date between TO_DATE('2015-11-02 00:00:00', 'YYYY-MM-DD hh24:mi:ss') 
    AND TO_DATE('2016-02-08 00:00:00', 'YYYY-MM-DD hh24:mi:ss') 
GROUP BY TRUNC(submit_date, 'iw'),(TO_char((closed_date - submit_date),'dd/mm/yyyy'))/count(closed_date)) 
ORDER BY TRUNC(submit_date, 'iw') 

Mais vous manquez une parenthèse dans la clause GROUP BY:

SELECT TO_CHAR(TRUNC(submit_date, 'iw'), 'YYYY-MM-DD') [TIMESTAMP] 
,(TO_char((closed_date - submit_date),'dd/mm/yyyy'))/count(closed_date) [AVG] 


FROM t_oi_request_form rf 
LEFT JOIN t_oi_requester_domain rd ON rf.REQUEST_TYPE = rd.requester_domain_id 
LEFT JOIN t_oi_report_type rt ON rf.requestor_domain = rt.REPORT_TYPE_ID 
WHERE submit_date between TO_DATE('2015-11-02 00:00:00', 'YYYY-MM-DD hh24:mi:ss') 
    AND TO_DATE('2016-02-08 00:00:00', 'YYYY-MM-DD hh24:mi:ss') 
GROUP BY TRUNC(submit_date, 'iw'),((TO_char((closed_date - submit_date),'dd/mm/yyyy'))/count(closed_date)) 
ORDER BY TRUNC(submit_date, 'iw') 

cela devrait résoudre:

erreur dans la requête: ORA-00933: commande SQL pas correctement terminé

1

Cela devrait vous donner la différence de temps moyen entre submit_date et closed_date pour chaque semaine:

SELECT TRUNC(submit_date, 'iw') 
    ,AVG(closed_date - submit_date) 
    --,AVG(TRUNC(closed_date) - TRUNC(submit_date)) -- ?? 

FROM t_oi_request_form rf 
LEFT JOIN t_oi_requester_domain rd 
    ON rf.REQUEST_TYPE = rd.requester_domain_id 
LEFT JOIN t_oi_report_type rt 
    ON rf.requestor_domain = rt.REPORT_TYPE_ID 
WHERE submit_date between TO_DATE('2015-11-02 00:00:00', 'YYYY-MM-DD hh24:mi:ss') 
         AND TO_DATE('2016-02-08 00:00:00', 'YYYY-MM-DD hh24:mi:ss') 
GROUP BY TRUNC(submit_date, 'iw') 
ORDER BY TRUNC(submit_date, 'iw') 

Il n'y a pas besoin de faire un SUM/COUNT parce que les fonctions globales ne tiennent pas compte des valeurs NULL de toute façon. Et si vous ne vous souciez pas des valeurs NULL, vous pourriez changer les jointures externes en internes.

0

Les expressions dans la liste SELECT semblent un peu trop compliquées, pour calculer le nombre de jours entre deux dates, puis les agréger dans une moyenne.

Je ne comprends pas pourquoi vous ne pas simplement utiliser la fonction d'agrégation AVG:

AVG(rf.closed_date - rf.submit_date) 

qui est, quelque chose comme ceci:

SELECT TO_CHAR(TRUNC(rf.submit_date,'iw'),'YYYY-MM-DD') AS TIMESTAMP 
    , AVG(rf.closed_date - rf.submit_date)   AS avg_days_to_close 
    FROM t_oi_request_form rf 
    LEFT 
    JOIN t_oi_requester_domain rd 
    ON rf.REQUEST_TYPE = rd.requester_domain_id 
    LEFT 
    JOIN t_oi_report_type rt 
    ON rf.requestor_domain = rt.REPORT_TYPE_ID 
WHERE rf.submit_date >= TO_DATE('2015-11-02','YYYY-MM-DD') 
    AND rf.submit_date < TO_DATE('2016-02-08','YYYY-MM-DD') 
GROUP BY TO_CHAR(TRUNC(rf.submit_date,'iw'),'YYYY-MM-DD') 
ORDER BY TO_CHAR(TRUNC(rf.submit_date,'iw'),'YYYY-MM-DD') 

Nous pourrions obtenir un équivalent résultat en utilisant SUM(), COUNT() et une opération de division:

SUM(rf.closed_date - rf.submit_date)/COUNT(rf.closed_date - rf.submit_date)