Sql 确定一年中每周的未决案件

Sql 确定一年中每周的未决案件,sql,oracle,Sql,Oracle,我正试图制作一份报告,确定一年中每周都有未结的客户案例。目前,我有下面的SQL,它返回所有客户机,并指示他们的案例是否在日历的第一周打开。客户有两个方面可确定其案件是否未决——其MOV_开始日期和ESU开始日期应大于该期间的结束日期,且其MOV_结束日期/ESU开始日期应为空或大于该期间的开始日期 下面的代码可以工作,但我想我可以复制左join WK1并将其重命名为WK2以返回第2周的信息,但是我遇到了一个与命名模糊的列相关的错误。此外,我猜在报告中留下52个连接(每周一个)不是特别明智,所以我

我正试图制作一份报告,确定一年中每周都有未结的客户案例。目前,我有下面的SQL,它返回所有客户机,并指示他们的案例是否在日历的第一周打开。客户有两个方面可确定其案件是否未决——其MOV_开始日期和ESU开始日期应大于该期间的结束日期,且其MOV_结束日期/ESU开始日期应为空或大于该期间的开始日期

下面的代码可以工作,但我想我可以复制左join WK1并将其重命名为WK2以返回第2周的信息,但是我遇到了一个与命名模糊的列相关的错误。此外,我猜在报告中留下52个连接(每周一个)不是特别明智,所以我想知道是否有更好的方法来实现这一点

    SELECT
A.ESU_PER_GRO_ID,
A.ESU_ID,
A.STATUS,
B.MOV_ID,
B.MOV_START_DATE,
B.MOV_END_DATE,
A.ESU_START_DATE,
A.ESU_END_DATE,
LS.CLS_DESC,
nvl2(wk1.PRD_PERIOD_NUM,'Y','N') as "Week1"

FROM
A

LEFT JOIN B ON B.MOV_PER_GRO_ID = A.ESU_PER_GRO_ID

LEFT JOIN LS ON LS.CLS_CODE = A.STATUS

LEFT JOIN O_PERIODS WK1 ON B.MOV_START_DATE < WK1.PRD_END_DATE
AND (B.MOV_END_DATE IS NULL OR B.MOV_END_DATE > WK1.PRD_START_DATE)
AND A.ESU_START_DATE  < WK1.PRD_END_DATE
AND (A.ESU_END_DATE IS NULL OR A.ESU_END_DATE > WK1.PRD_START_DATE)
AND PRD_CAL_ID = 'E1190' AND WK1.PRD_PERIOD_NUM = 1 AND WK1.PRD_YEAR = 2012

WHERE
B.MOV_START_DATE  Is Not Null  
AND A.STATUS <> ('X') 
期望输出(第一周-第52周)


我怀疑像WK1这样创建WK2联接不起作用的原因是列PRD_CAL_ID上没有表别名。但是,正如您所猜测的,52个联接可能不会表现得很好。请尝试以下操作:

SELECT A.ESU_PER_GRO_ID,    
       A.ESU_ID,    
       A.STATUS,    
       B.MOV_ID,    
       B.MOV_START_DATE,    
       B.MOV_END_DATE,    
       A.ESU_START_DATE,    
       A.ESU_END_DATE,    
       LS.CLS_DESC,    
       'Week' || TRIM(TO_CHAR(pd.PRD_PERIOD_NUM)) WEEK_DESC
  FROM A
  LEFT JOIN B
    ON B.MOV_PER_GRO_ID = A.ESU_PER_GRO_ID    
  LEFT JOIN LS
    ON LS.CLS_CODE = A.STATUS    
  LEFT JOIN O_PERIODS pd
    ON B.MOV_START_DATE < pd.PRD_END_DATE AND
       (B.MOV_END_DATE IS NULL OR
        B.MOV_END_DATE > pd.PRD_START_DATE) AND
       A.ESU_START_DATE  < pd.PRD_END_DATE AND
       (A.ESU_END_DATE IS NULL OR
        A.ESU_END_DATE > pd.PRD_START_DATE)
WHERE B.MOV_START_DATE Is Not Null AND
      A.STATUS <> ('X') AND
      pd.PRD_CAL_ID = 'E1190' AND
      pd.PRD_YEAR = 2012
ORDER BY WEEK_DESC
根据GRO ID选择一个ESU,
A.ESU_ID,
A.地位,
B.MOV_ID,
B.移动开始日期,
B.移动结束日期,
A.ESU开始日期,
A.ESU结束日期,
LS.CLS_DESC,
“周”| |修剪(至|字符(pd.PRD |周期|数字))周|说明
从
左连接B
在B.MOV_PER_GRO_ID=A.ESU PER_GRO_ID上
左连接
在LS.CLS_代码=A.STATUS上
左连接O_周期pd
在B.MOV开始日期pd.PRD开始日期)和
A.ESU开始日期pd.PRD开始日期)
其中,B.MOV_开始日期不为空,并且
A.状态(“X”)和
pd.PRD_CAL_ID='E1190'和
pd.PRD_年份=2012年
按周订购
这会产生与原始查询稍有不同的结果,使用WEEK_DESC,而不是尝试创建52个不同的列,每个列对应一周,但我认为它的性能会更好


分享和享受。

谢谢,我会尽快测试并反馈。@Bob Jarvis-刚刚测试过,它工作得很好。性能似乎非常快,您刚刚帮助我用一个可爱、快速的查询替换了一个非常繁琐的电子表格。非常感谢!
 P ID    ESU_ID STATUS  MOV_ID  M_START     M_END   DESC    Week1 Week2
 1      ESU1       New     1M   01/01/2012           Boo    Y     Y
 2      ESU2       New     2M   01/03/2012           Boo    N     N
SELECT A.ESU_PER_GRO_ID,    
       A.ESU_ID,    
       A.STATUS,    
       B.MOV_ID,    
       B.MOV_START_DATE,    
       B.MOV_END_DATE,    
       A.ESU_START_DATE,    
       A.ESU_END_DATE,    
       LS.CLS_DESC,    
       'Week' || TRIM(TO_CHAR(pd.PRD_PERIOD_NUM)) WEEK_DESC
  FROM A
  LEFT JOIN B
    ON B.MOV_PER_GRO_ID = A.ESU_PER_GRO_ID    
  LEFT JOIN LS
    ON LS.CLS_CODE = A.STATUS    
  LEFT JOIN O_PERIODS pd
    ON B.MOV_START_DATE < pd.PRD_END_DATE AND
       (B.MOV_END_DATE IS NULL OR
        B.MOV_END_DATE > pd.PRD_START_DATE) AND
       A.ESU_START_DATE  < pd.PRD_END_DATE AND
       (A.ESU_END_DATE IS NULL OR
        A.ESU_END_DATE > pd.PRD_START_DATE)
WHERE B.MOV_START_DATE Is Not Null AND
      A.STATUS <> ('X') AND
      pd.PRD_CAL_ID = 'E1190' AND
      pd.PRD_YEAR = 2012
ORDER BY WEEK_DESC