2015-02-09 47 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