2017-07-26 53 views
0

我創建了一個查詢,它計算多個表中多個總和的平均值。這需要每週運行一次,以及代碼的製作方式,我現在每次都需要在查詢中更改4個日期。我認爲這可以更有效地完成,但我不確定如何。需要簡化SQL查詢(在四個位置輸入日期)

Select ROUND(

(Select sum (calls) 
      FROM (SELECT sum(ski.ANSTIME) AS calls 
      FROM SYNONYMS syn 
      JOIN SKILL ski on (syn.value = ski.split) 
      WHERE syn.ITEM_TYPE = 'split' 
      AND (SELECT (timestamp '1970-01-01 00:00:00 GMT' +numtodsinterval(ski.starttime_utc, 'SECOND')) 
       at time zone 'Europe/Warsaw' 
       FROM dual) >= '17-07-17 00:00:00 EUROPE/WARSAW' -- Date to be altered every week 
      AND (SELECT (timestamp '1970-01-01 00:00:00 GMT' +numtodsinterval(ski.starttime_utc, 'SECOND')) 
       at time zone 'Europe/Warsaw' 
       FROM dual) <= '24-07-17 00:00:00 EUROPE/WARSAW' -- Date to be altered every week 

      UNION ALL 

      SELECT sum(vdn.ANSTIME) AS calls 
      FROM SYNONYMS syn 
      JOIN VDN vdn on (syn.value = vdn.vdn) 
      WHERE syn.ITEM_TYPE = 'vdn' 
      AND (SELECT (timestamp '1970-01-01 00:00:00 GMT' +numtodsinterval(vdn.starttime_utc, 'SECOND')) 
       at time zone 'Europe/Warsaw' 
       FROM dual) >= '17-07-17 00:00:00 EUROPE/WARSAW' -- Date to be altered every week 
      AND (SELECT (timestamp '1970-01-01 00:00:00 GMT' +numtodsinterval(vdn.starttime_utc, 'SECOND')) 
       at time zone 'Europe/Warsaw' 
       FROM dual) <= '24-07-17 00:00:00 EUROPE/WARSAW')) -- Date to be altered every week 

/-- devided by 

      (SELECT sum (calltime) 
      FROM  (SELECT sum(ski.acdcalls) AS calltime 
      FROM SYNONYMS syn 
      JOIN SKILL ski on (syn.value = ski.split) 
      WHERE syn.ITEM_TYPE = 'split' 
      AND (SELECT (timestamp '1970-01-01 00:00:00 GMT' +numtodsinterval(ski.starttime_utc, 'SECOND')) 
       at time zone 'Europe/Warsaw' 
       FROM dual) >= '17-07-17 00:00:00 EUROPE/WARSAW' -- Date to be altered every week 
      AND (SELECT (timestamp '1970-01-01 00:00:00 GMT' +numtodsinterval(ski.starttime_utc, 'SECOND')) 
       at time zone 'Europe/Warsaw' 
       FROM dual) <= '24-07-17 00:00:00 EUROPE/WARSAW' -- Date to be altered every week 

      UNION ALL 

      SELECT sum(vdn.acdcalls) AS calltime 
      FROM SYNONYMS syn 
      JOIN VDN vdn on (syn.value = vdn.vdn) 
      WHERE syn.ITEM_TYPE = 'vdn' 
      AND (SELECT (timestamp '1970-01-01 00:00:00 GMT' +numtodsinterval(vdn.starttime_utc, 'SECOND')) 
       at time zone 'Europe/Warsaw' 
       FROM dual) >= '17-07-17 00:00:00 EUROPE/WARSAW' -- Date to be altered every week 
      AND (SELECT (timestamp '1970-01-01 00:00:00 GMT' +numtodsinterval(vdn.starttime_utc, 'SECOND')) 
       at time zone 'Europe/Warsaw' 
       FROM dual) <= '24-07-17 00:00:00 EUROPE/WARSAW')) -- Date to be altered every week 

,0) AS average 
FROM dual 
+0

爲什麼不把它轉換成有兩個參數的程序,這樣你每次都改變參數? –

+0

synoyms.item_type是唯一的嗎?或者每個synonym.item_type可能有多個synonym.value值? – Boneist

+0

syn.item_type不唯一,每個syn有很多不同的syn.value值.item_type – Andre

回答

0

如果我理解正確你想生成一些每週彙總,以便代替輸入日期,你可以嘗試使用trunc(sysdate)的第二次約會和trunc(sysdate - 7)第一。

第二種可能性是創建臨時表(或只是with語句),它將保存單個日期並將其加入到您的查詢中。相反<= '24-07-17 00:00:00 EUROPE/WARSAW'你將有<= temp_date其中temp_date來自CTE。

+0

這些表具有以unix時間碼存儲的調用開始時間。每週我都需要平均收到前一週收到的所有電話(示例中的第29周)。因此,除非使用sysdate來查找前一週的開始和結束,否則sysdate將不起作用。使用存儲過程可能會有效,但還沒有弄清楚。 – Andre

+0

但是,您可以將您的unix時間甚至一週的開始基於此插入到臨時表中,然後加入到表中。 – Kacper

+0

對於一週開始嘗試這個https://stackoverflow.com/questions/5515514/how-to-get-first-and-last-day-of-week-in-oracle – Kacper