2015-02-09 25 views
2

我試圖讓使用來自從指定日期範圍涵蓋Oracle數據S曲線分析,查詢數據

我的查詢看起來像這樣,

SELECT LEVEL WEEK_NUM_INCR, 
      TO_CHAR (start_date + (LEVEL - 1) * 7, 'WW') WEEK_POSITION, 
      /* WEEK POSITION FOR THE WHOLE YEAR */ 
      TO_CHAR (start_date + (LEVEL - 1) * 7, 'MM/DD/YYYY') START_WEEK_DATE, 
      TO_CHAR (start_date + (LEVEL) * 7, 'MM/DD/YYYY') END_WEEK_DATE, 
      (SELECT SUM (ONSITE_UPD_QTY) 
       FROM [email protected]_SITEMON_LINK 
      WHERE  UPD_DATE BETWEEN RS.start_date AND RS.end_date 
        AND PROJECT_NAME IN (SELECT PROJECT_NAME 
              FROM PROJECT 
             WHERE PROJECT_NO = RS.JOB_NAME)) 
       ONSITEQTY 
     FROM (SELECT PS.PROJECT_START_DT start_date, 
        PS.JOB_NAME JOB_NAME, 
        PS.PROJECT_END_DT end_date 
       FROM PROJECT_SPAN PS 
      WHERE PS.JOB_NAME = 'W-14026') RS 
CONNECT BY start_date + (LEVEL - 1) * 7 < end_date; 

所以上該PROJECT_SPAN表中的內容,

PROJECT_START_DT PROJECT_END_DT JOB_NAME 
1/1/2015   2/1/2015  W-14026 

而且在DTL_ERC_UPD @ WELTES_SITEMON_LINK內容,

PROJECT_NAME UPD_DATE    ONSITE_UPD_QTY 
--------------------------------------------------- 
SMSMILLHOUSE 2/5/2015 12:00:01 AM 2 
SMSSUGARWHOUSE 2/5/2015 12:00:01 AM 2 
SMSMILLHOUSE 2/4/2015 12:00:01 AM 4 
SMSMILLHOUSE 2/4/2015 12:00:01 AM 6 
IGGMILLHOUSE 2/4/2015 12:00:01 AM 4 
IGGMILLHOUSE 2/4/2015 12:00:01 AM 6 

所以連接表項目包含,

PROJECT_NO PROJECT_NAME 
----------------------- 
W-14026 SMSMILLHOUSE 
W-14026 SMSSUGARWHOUSE 

當我查詢該SQL我得到這個只有

WEEK_NUM_INCR WEEK_POSITION START_WEEK_DATE END_WEEK_DATE ONSITEQTY 
1.00   01    01/01/2015  01/08/2015 
2.00   02    01/08/2015  01/15/2015 
3.00   03    01/15/2015  01/22/2015 
4.00   04    01/22/2015  01/29/2015 
5.00   05    01/29/2015  02/05/2015 

預期的輸出是

WEEK_NUM_INCR WEEK_POSITION START_WEEK_DATE END_WEEK_DATE ONSITEQTY 
    1.00   01    01/01/2015  01/08/2015 0 
    2.00   02    01/08/2015  01/15/2015 0 
    3.00   03    01/15/2015  01/22/2015 0 
    4.00   04    01/22/2015  01/29/2015 0 
    5.00   05    01/29/2015  02/05/2015 14 

請幫我我的查詢錯過了什麼?

非常感謝

回答

1

你爲什麼想到ONSITEQTY成爲WEEK_NUM_INCR = 5月14日?

DTL_ERC_UPD包含2行4行和2行5行(其餘兩行由於PROJECT_NAME限制而不適合)。

START_DATEEND_DATE在PROJECT_SPAN只包括1 - 有一些符合條件「與」無行。您好像預計DTL_ERC_UPD將限制在START_WEEK_DATEEND_WEEK_DATE之間。如果是這樣的話,那麼你需要一個包查詢更多的選擇是這樣的:

with PROJECT as (
    select 'W-14026' as PROJECT_NO, 'SMSMILLHOUSE' as PROJECT_NAME from dual union all 
    select 'W-14026', 'SMSSUGARWHOUSE' from dual 
), 
DTL_ERC_UPD as (
    select 'SMSMILLHOUSE' as PROJECT_NAME, to_date('2/5/2015 12:00:01 AM', 'mm/dd/yyyy hh:mi:ss AM') as UPD_DATE, 2 as ONSITE_UPD_QTY from dual union all 
    select 'SMSSUGARWHOUSE', to_date('2/5/2015 12:00:01 AM', 'mm/dd/yyyy hh:mi:ss AM'), 2 from dual union all 
    select 'SMSMILLHOUSE', to_date('2/4/2015 12:00:01 AM', 'mm/dd/yyyy hh:mi:ss AM'), 4 from dual union all 
    select 'SMSMILLHOUSE', to_date('2/4/2015 12:00:01 AM', 'mm/dd/yyyy hh:mi:ss AM'), 6 from dual union all 
    select 'IGGMILLHOUSE', to_date('2/4/2015 12:00:01 AM', 'mm/dd/yyyy hh:mi:ss AM'), 4 from dual union all 
    select 'IGGMILLHOUSE', to_date('2/4/2015 12:00:01 AM', 'mm/dd/yyyy hh:mi:ss AM'), 6 from dual 
), 
PROJECT_SPAN as (
    select to_date('1/1/2015', 'mm/dd/yyyy') as PROJECT_START_DT, to_date('2/1/2015', 'mm/dd/yyyy') as PROJECT_END_DT, 'W-14026' as JOB_NAME from dual 
) 
select WEEK_NUM_INCR, 
     TO_CHAR (START_WEEK_DATE, 'WW') WEEK_POSITION, 
     /* WEEK POSITION FOR THE WHOLE YEAR */ 
     TO_CHAR (START_WEEK_DATE, 'MM/DD/YYYY') START_WEEK_DATE, 
     TO_CHAR (END_WEEK_DATE, 'MM/DD/YYYY') END_WEEK_DATE, 
     (SELECT SUM (ONSITE_UPD_QTY) 
      FROM DTL_ERC_UPD 
     WHERE  UPD_DATE BETWEEN rs.START_WEEK_DATE AND rs.END_WEEK_DATE 
       AND PROJECT_NAME IN (SELECT PROJECT_NAME 
             FROM PROJECT 
            WHERE PROJECT_NO = RS.JOB_NAME)) ONSITEQTY 
from (SELECT LEVEL WEEK_NUM_INCR, 
       start_date + (LEVEL - 1) * 7 START_WEEK_DATE, 
       start_date + (LEVEL) * 7 END_WEEK_DATE, 
       RS.JOB_NAME 
     FROM (SELECT PS.PROJECT_START_DT start_date, 
         PS.JOB_NAME JOB_NAME, 
         PS.PROJECT_END_DT end_date 
       FROM PROJECT_SPAN PS 
       WHERE PS.JOB_NAME = 'W-14026') RS 
     CONNECT BY start_date + (LEVEL - 1) * 7 < end_date) rs 

但不管怎麼說,ONSITEQTY是10,不是14,因爲在上週00:00:00 2月5日結束上。並且兩行DTL_ERC_UPD的UPD_DATE有一分鐘。他們在上週不適合。

+0

THanks qualtgh ...在這種情況下IGGMILLHOUSE不計算在查詢中,因爲只涵蓋SMSMILLHOUSE和SMSSUGARWHOUSE .. – 2015-02-10 01:57:50

+1

@KonzMama:是的,我明白了。 IGGMILLHOUSE不適合。二月,五日不適合。只有兩條記錄適合於2月4日的SMSMILLHOUSE。總計10。這是預期的嗎? – Qualtagh 2015-02-10 03:34:40

+0

是它的權利,但這個查詢是否符合數據更改?因此用戶只需輸入PROJECT_SPAN表中的PROJECT_START_DATE和PROJECT_END_DT,並且輸出應該隨着用戶在DTL_ERC_UPD內輸入更多數據而動態更改。 – 2015-02-10 06:26:33