我正在尝试使用 Oracle Cloud Fusion - 拨款管理中的 BI Publisher 报告提取一些奖项属性。我的查询包括一个需要算术计算并从那里转换为字符的字段,
我的BIP查询如下,
SELECT
GMS_AWDINFO.CONTRACT_NUMBER AWARD_NUMBER
,GMS_AWDINFO.CONTRACT_NAME AWARD_NAME
,GMS_AWDINFO.ATTRIBUTE2 BILL_TYPE
,GMS_AWDINFO.STS_CODE AWARD_STATUS
,TO_CHAR(GMS_AWDINFO.END_DATE,'MM/DD/YYYY') AS AWARD_END_DATE
,(CASE
WHEN to_date(GMS_AWDINFO.END_DATE, 'yyyy-mm-dd') - trunc(sysdate) > 30
THEN 'Over 30 Days'
WHEN to_date(GMS_AWDINFO.END_DATE, 'yyyy-mm-dd') - trunc(sysdate) between 30 and 1 THEN 'Within 30 Days'
WHEN to_date(GMS_AWDINFO.END_DATE, 'yyyy-mm-dd') - trunc(sysdate) < 1 THEN 'Expired'
END) AS AWARD_EXPIRATION_STATUS
FROM
GMS_AWARD_HEADERS_INFO_V GMS_AWDINFO
WHERE
GMS_AWDINFO.CONTRACT_NUMBER IS NOT NULL
AND (GMS_AWDINFO.CONTRACT_NUMBER IN (:P_AWARD_NUMBER) OR 'ALL' IN (:P_AWARD_NUMBER||'ALL'))
AND (GMS_AWDINFO.STS_CODE IN (:P_AWARD_STATUS) OR 'ALL' IN (:P_AWARD_STATUS||'ALL'))
AND (
CASE WHEN :P_EXPIRATION_STATUS = 'Over 30 Days'
THEN (to_date(GMS_AWDINFO.END_DATE, 'yyyy-mm-dd') - trunc(sysdate)) > 30
WHEN :P_EXPIRATION_STATUS = 'Within 30 Days'
THEN (to_date(GMS_AWDINFO.END_DATE, 'yyyy-mm-dd') - trunc(sysdate)) between 30 and 1
ELSE (to_date(GMS_AWDINFO.END_DATE, 'yyyy-mm-dd') - trunc(sysdate)) < 1
END
)
GROUP BY
GMS_AWDINFO.CONTRACT_NUMBER
,GMS_AWDINFO.CONTRACT_NAME
,GMS_AWDINFO.ATTRIBUTE2
,GMS_AWDINFO.STS_CODE
,GMS_AWDINFO.END_DATE
在我的where子句中,我需要传递参数
P_EXPIRATION_STATUS
变量,并且需要在where子句中计算后检查相应的值。
所以这里根据变量的值,需要进行计算后进行检查。我在 where 子句中添加了 case 语句。
但我越来越
ORA-00905: missing keyword
.
我刚刚开始使用 Oracle BIP 报告。那么有人可以建议或指导我解决这个问题吗?
或者我需要在这里使用任何不同的方法吗?
CASE
表达式返回标量值,它们不返回表达式。只需使用 AND
和 OR
。
SELECT CONTRACT_NUMBER AS AWARD_NUMBER
,CONTRACT_NAME AS AWARD_NAME
,ATTRIBUTE2 AS BILL_TYPE
,STS_CODE AS AWARD_STATUS
,TO_CHAR(END_DATE,'MM/DD/YYYY') AS AWARD_END_DATE
,CASE
WHEN TRUNC(END_DATE) - trunc(sysdate) > 30
THEN 'Over 30 Days'
WHEN TRUNC(END_DATE) - trunc(sysdate) between 30 and 1
THEN 'Within 30 Days'
WHEN TRUNC(END_DATE) - trunc(sysdate) < 1
THEN 'Expired'
END AS AWARD_EXPIRATION_STATUS
FROM GMS_AWARD_HEADERS_INFO_V
WHERE CONTRACT_NUMBER IS NOT NULL
AND ( CONTRACT_NUMBER IN (:P_AWARD_NUMBER)
OR 'ALL' IN (:P_AWARD_NUMBER||'ALL')
)
AND ( STS_CODE IN (:P_AWARD_STATUS)
OR 'ALL' IN (:P_AWARD_STATUS||'ALL')
)
AND (
( :P_EXPIRATION_STATUS = 'Over 30 Days'
AND TRUNC(END_DATE) - trunc(sysdate) > 30
)
OR ( :P_EXPIRATION_STATUS = 'Within 30 Days'
AND TRUNC(END_DATE) - trunc(sysdate) between 30 and 1
)
OR ( :P_EXPIRATION_STATUS NOT IN ('Over 30 Days', 'Within 30 Days')
AND TRUNC(END_DATE) - trunc(sysdate) < 1
)
)
GROUP BY
CONTRACT_NUMBER
,CONTRACT_NAME
,ATTRIBUTE2
,STS_CODE
,END_DATE