Case语句上的SQL查询显示

Case语句上的SQL查询显示,sql,oracle,Sql,Oracle,我正在运行下面的SQL,当Alert为YES时,只需要显示这些行。查询返回一个错误 SELECT COMP, TO_CHAR(PERIOD_START, 'DAY') DOW, trunc(PERIOD_START) Period_Date, round((sum(EC) / sum(mon)) * 100, 2) Pct_EC, CASE WHEN COMP = 2 AND round((sum(EC) / sum(mon)) * 100, 2)

我正在运行下面的SQL,当Alert为YES时,只需要显示这些行。查询返回一个错误

SELECT
    COMP,
    TO_CHAR(PERIOD_START, 'DAY') DOW,
    trunc(PERIOD_START) Period_Date,
    round((sum(EC) / sum(mon)) * 100, 2) Pct_EC,
    CASE WHEN COMP = 2
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 2.96 THEN 'YES' WHEN COMP = 3
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 1.62 THEN 'YES' WHEN COMP = 4
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 2.06 THEN 'YES' ELSE 'NO' END as ALERT
FROM
    KPI
WHERE
    ALERT = 'YES'
    AND trunc(period_start) >= trunc(sysdate -7)
    and trunc(period_start) < trunc(sysdate)
GROUP BY
    trunc(period_start),
    TO_CHAR(PERIOD_START, 'DAY'),
    COMP,
    trunc(PERIOD_START)
ORDER BY
    trunc(period_start) desc,
    COMP,
    trunc(PERIOD_START)
选择
公司,
至CHAR(期间开始日)道指,
trunc(期间开始)期间日期,
四舍五入((总数(EC)/总数(mon))*100,2)厘,
COMP=2时的情况
四舍五入((总和(EC)/总和(mon))*100,2)>=2.96,当COMP=3时,则为“是”
四舍五入((总和(EC)/总和(mon))*100,2)>=1.62,当COMP=4时,则为“是”
和四舍五入((总和(EC)/总和(mon))*100,2)>=2.06,然后“是”或“否”以警报结束
从…起
关键绩效指标
哪里
警报='是'
和trunc(周期开始)>=trunc(sysdate-7)
和trunc(周期开始)
仅输出显示突出显示的记录


任何帮助都将不胜感激。

使用
have
过滤掉它们:

SELECT
    COMP,
    TO_CHAR(PERIOD_START, 'DAY') DOW,
    trunc(PERIOD_START) Period_Date,
    round((sum(EC) / sum(mon)) * 100, 2) Pct_EC,
    CASE WHEN COMP = 2
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 2.96 THEN 'YES' WHEN COMP = 3
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 1.62 THEN 'YES' WHEN COMP = 4
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 2.06 THEN 'YES' ELSE 'NO' END as ALERT
FROM
    KPI
WHERE
    trunc(period_start) >= trunc(sysdate -7)
    and trunc(period_start) < trunc(sysdate)
GROUP BY
    trunc(period_start),
    TO_CHAR(PERIOD_START, 'DAY'),
    COMP,
    trunc(PERIOD_START)
HAVING CASE WHEN COMP = 2
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 2.96 THEN 'YES' WHEN COMP = 3
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 1.62 THEN 'YES' WHEN COMP = 4
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 2.06 THEN 'YES' ELSE 'NO' END = 'YES'
ORDER BY
    trunc(period_start) desc,
    COMP,
    trunc(PERIOD_START)
选择
公司,
至CHAR(期间开始日)道指,
trunc(期间开始)期间日期,
四舍五入((总数(EC)/总数(mon))*100,2)厘,
COMP=2时的情况
四舍五入((总和(EC)/总和(mon))*100,2)>=2.96,当COMP=3时,则为“是”
四舍五入((总和(EC)/总和(mon))*100,2)>=1.62,当COMP=4时,则为“是”
和四舍五入((总和(EC)/总和(mon))*100,2)>=2.06,然后“是”或“否”以警报结束
从…起
关键绩效指标
哪里
trunc(周期开始)>=trunc(sysdate-7)
和trunc(周期开始)=2.96,当COMP=3时,则为“是”
四舍五入((总和(EC)/总和(mon))*100,2)>=1.62,当COMP=4时,则为“是”
和四舍五入((总和(EC)/总和(mon))*100,2)>=2.06,然后“是”或“否”结束=“是”
订购人
trunc(周期开始)说明,
公司,
trunc(周期开始)

使用
have
过滤掉它们:

SELECT
    COMP,
    TO_CHAR(PERIOD_START, 'DAY') DOW,
    trunc(PERIOD_START) Period_Date,
    round((sum(EC) / sum(mon)) * 100, 2) Pct_EC,
    CASE WHEN COMP = 2
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 2.96 THEN 'YES' WHEN COMP = 3
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 1.62 THEN 'YES' WHEN COMP = 4
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 2.06 THEN 'YES' ELSE 'NO' END as ALERT
FROM
    KPI
WHERE
    trunc(period_start) >= trunc(sysdate -7)
    and trunc(period_start) < trunc(sysdate)
GROUP BY
    trunc(period_start),
    TO_CHAR(PERIOD_START, 'DAY'),
    COMP,
    trunc(PERIOD_START)
HAVING CASE WHEN COMP = 2
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 2.96 THEN 'YES' WHEN COMP = 3
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 1.62 THEN 'YES' WHEN COMP = 4
    AND round((sum(EC) / sum(mon)) * 100, 2) >= 2.06 THEN 'YES' ELSE 'NO' END = 'YES'
ORDER BY
    trunc(period_start) desc,
    COMP,
    trunc(PERIOD_START)
选择
公司,
至CHAR(期间开始日)道指,
trunc(期间开始)期间日期,
四舍五入((总数(EC)/总数(mon))*100,2)厘,
COMP=2时的情况
四舍五入((总和(EC)/总和(mon))*100,2)>=2.96,当COMP=3时,则为“是”
四舍五入((总和(EC)/总和(mon))*100,2)>=1.62,当COMP=4时,则为“是”
和四舍五入((总和(EC)/总和(mon))*100,2)>=2.06,然后“是”或“否”以警报结束
从…起
关键绩效指标
哪里
trunc(周期开始)>=trunc(sysdate-7)
和trunc(周期开始)=2.96,当COMP=3时,则为“是”
四舍五入((总和(EC)/总和(mon))*100,2)>=1.62,当COMP=4时,则为“是”
和四舍五入((总和(EC)/总和(mon))*100,2)>=2.06,然后“是”或“否”结束=“是”
订购人
trunc(周期开始)说明,
公司,
trunc(周期开始)

这里是另一种子查询方法,在trunc(PERIOD_START)之后只进行一次排序/分组,并解码以消除7倍的总和/轮数等:

我假设子选择在这里是合适的,因为结果集不会太大

SELECT COMP, DOW, Period_date, pct_ec, 'YES' as alert
FROM
(SELECT
    COMP,
    TO_CHAR(PERIOD_START, 'DAY') DOW,
    trunc(PERIOD_START) Period_Date,
    round((sum(EC) / sum(mon)) * 100, 2) Pct_EC
FROM
    KPI
WHERE
    trunc(period_start) >= trunc(sysdate -7)
    and trunc(period_start) < trunc(sysdate)
GROUP BY
    trunc(period_start),
    TO_CHAR(PERIOD_START, 'DAY'),
    COMP ) temp
WHERE 
   COMP in (2,3,4) 
       AND pct_ec >= decode( COMP, 2, 2.96, 3, 1.62, 4, 2.06, 0)   
ORDER BY
    period_date desc,
    COMP
选择公司、道琼斯指数、期间日期、pct\U ec,“是”作为警报
从…起
(选择
公司,
至CHAR(期间开始日)道指,
trunc(期间开始)期间日期,
四舍五入((总数(EC)/总数(mon))*100,2)厘
从…起
关键绩效指标
哪里
trunc(周期开始)>=trunc(sysdate-7)
和trunc(周期开始)=解码(COMP,2,2.96,3,1.62,4,2.06,0)
订购人
期间/日期说明,
公司

这里是另一种子查询方法,在trunc(PERIOD_START)之后只进行一次排序/分组,并解码以消除7倍的总和/轮数等:

我假设子选择在这里是合适的,因为结果集不会太大

SELECT COMP, DOW, Period_date, pct_ec, 'YES' as alert
FROM
(SELECT
    COMP,
    TO_CHAR(PERIOD_START, 'DAY') DOW,
    trunc(PERIOD_START) Period_Date,
    round((sum(EC) / sum(mon)) * 100, 2) Pct_EC
FROM
    KPI
WHERE
    trunc(period_start) >= trunc(sysdate -7)
    and trunc(period_start) < trunc(sysdate)
GROUP BY
    trunc(period_start),
    TO_CHAR(PERIOD_START, 'DAY'),
    COMP ) temp
WHERE 
   COMP in (2,3,4) 
       AND pct_ec >= decode( COMP, 2, 2.96, 3, 1.62, 4, 2.06, 0)   
ORDER BY
    period_date desc,
    COMP
选择公司、道琼斯指数、期间日期、pct\U ec,“是”作为警报
从…起
(选择
公司,
至CHAR(期间开始日)道指,
trunc(期间开始)期间日期,
四舍五入((总数(EC)/总数(mon))*100,2)厘
从…起
关键绩效指标
哪里
trunc(周期开始)>=trunc(sysdate-7)
和trunc(周期开始)=解码(COMP,2,2.96,3,1.62,4,2.06,0)
订购人
期间/日期说明,
公司

我收到错误ORA-00904:“警报”:无效标识符。请告知。@SQLNearoor请参阅更新的答案。我收到此错误ORA-00904:“警报”:无效标识符。请建议。@SQL初学者查看更新的答案