【问题标题】:Querying data for S-Curve Purposes为 S 曲线目的查询数据
【发布时间】:2015-04-08 18:27:12
【问题描述】:

我正在尝试使用来自指定日期范围的 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 DTL_ERC_UPD@WELTES_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 包含,

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

请帮助我的查询缺少什么???

非常感谢

【问题讨论】:

    标签: sql oracle date plsql


    【解决方案1】:

    为什么您希望 ONSITEQTY 为 14 且 WEEK_NUM_INCR = 5?

    DTL_ERC_UPD 包含 2 月 4 日的两行和 5 日的两行(由于 PROJECT_NAME 限制,其余两行不适合)。

    PROJECT_SPAN 中的

    START_DATEEND_DATE 仅包括一月 - 没有适合“介于”条件的行。您似乎希望 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,因为最后一周在 2 月 5 日 00:00:00 结束。两行 DTL_ERC_UPD 的 UPD_DATE 增加了一分钟。它们不适合上周。

    【讨论】:

    • 谢谢 qualtgh... 在这种情况下 IGGMILLHOUSE 不计入查询,因为仅涵盖 SMSMILLHOUSE 和 SMSSUGARWHOUSE..
    • @KonzMama:是的,我明白了。 IGGMILLHOUSE 不适合。 2 月 5 日不适合。仅有的两条适合的记录是 2 月 4 日的 SMSMILLHOUSE。一共是10个。这是预期的结果吗?
    • 是的,但这个查询是否符合数据更改?这样用户只能从 PROJECT_SPAN 表中输入 PROJECT_START_DATE 和 PROJECT_END_DT,并且输出应该随着用户在 DTL_ERC_UPD 中输入更多数据而动态变化
    • 是的,这是一个稍微修改过的原始查询。删除with-constructions,添加指向 DTL_ERC_UPD 的链接,它将像原始查询一样适合您的环境。
    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2019-09-07
    • 2018-10-02
    相关资源
    最近更新 更多