0

我正在尝试制作一份报告,以识别一年中每周开放的客户案例。目前,我有以下 SQL,它返回所有客户,并指示他们的案件是否在我们日历的第 1 周开放。客户有两个方面来确定他们的案件是否开放 - 他们的 MOV_START_DATE 和他们的 ESU_START DATE 应该大于该期间的结束日期,并且他们的 MOV_END_DATE/ESU_START DATE 应该为空或大于该期间的开始日期。

下面的代码有效,但我想我可以复制左连接 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') 

希望我提供了足够的信息,但如果没有,我很乐意回答问题。谢谢!

样本数据(由上述查询产生)

 P ID    ESU_ID STATUS  MOV_ID  M_START     M_END   DESC    Week1
 1      ESU1       New      1M  01/01/2012           Boo    Y
 2      ESU2       New     2M   01/03/2012           Boo    N

预期产出(第 1 周 - 第 52 周)

 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
4

1 回答 1

2

我怀疑创建像 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

这会产生与原始查询略有不同的结果,使用 WEEK_DESC 而不是尝试创建 52 个不同的列,每周一个,但我认为它会执行得更好。

分享和享受。

于 2012-07-04T14:52:39.940 回答