我正在尝试制作一份报告,以确定一年中每周开放的客户案例。目前我有以下SQL,它返回所有客户端,并指示他们的案例是否在我们日历的第1周期间打开。客户有两个方面可以确定他们的案例是否开放 - 他们的MOV_START_DATE和他们的ESU_START日期应该大于期间的结束日期,他们的MOV_END_DATE / ESU_START日期应该为空或大于期间的开始日期。 / p>
以下代码有效,但我想我可以复制左连接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
答案 0 :(得分: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个不同的列,每周一个,但我认为它会表现更好。
分享并享受。