-1

查询无需 case 语句即可工作。在我为下面的查询添加 CASE 语句后,获取 ORA-00979(不是 GROUP BY 表达式)(因为我没有在 GROUP BY 子句中添加 case 语句)。在我尝试之后(添加到 Group By),我得到了 ORA-22818(此处不允许子查询表达式)。有什么建议么?

注意:所有左外连接都是引用表 Table: d_r_o og 是主 DIM 表。

case 语句是为某些数据条件返回一个时间戳条件。

select nvl(country_name,'unknown_cntry') CNTRY_NAME, 
       nvl(rs.reg_tp_nm,'rgs_stus') RG_STUS,
       nvl(REBTN,'u_B_type') B_type_nm,
       decode(to_char(og.TIMESTAMP, 'YYYY'),
                '2015', 'CCCASE',
                        'CURRENT'),
       count(dkey),
       (CASE
          WHEN PG.rite_ts <= (SELECT pssd_dt
                                FROM lpyr
                                WHERE LPYR.PGY_KEY = OG.r_Pgy_KEY)
            THEN 'RECTIFIED'
          ELSE 'no'
        END) RCT_STUS,
  FROM d_r_o og
  left outer join LORSR rs
    on og.key = rs.key
  left outer join LRBR br
    on og.key = br.key
  left outer join LUST st
    on og.key = st.key
  group by nvl(country_name,'unknown_cntry') CNTRY_NAME, 
           nvl(rs.reg_tp_nm,'rgs_stus') RG_STUS,
           nvl(REBTN,'u_B_type') B_type_nm,
           decode(to_char(og.TIMESTAMP, 'YYYY'),
                    '2015', 'CCCASE',
                            'CURRENT'),
           count(dkey);
4

2 回答 2

0

对于您的 ORA-22818错误,您应该更改此

 when PG.rite_ts <= (SELECT pssd_dt FROM lpyr WHERE LPYR.PGY_KEY = OG.r_Pgy_KEY)

因为子查询表达式 SELECT pssd_dt可能返回很多行,而不是一个值来比较PG.rite_ts

一种解决方案应该是使用min(或max?)函数

when PG.rite_ts <= (SELECT min(pssd_dt) FROM lpyr WHERE LPYR.PGY_KEY = OG.r_Pgy_KEY)
于 2016-04-30T01:31:13.587 回答
0

感谢您的输入。我能够使用您的每一条反馈来解决这个问题。我几乎从案例中删除了 lpyr 并将其作为另一个左外连接放在 from 语句中。

然后我将 CASE 语句替换为: (CASE WHEN PG.rite_ts <= lpyr.pssd_dt
THEN 'RECTIFIED' ELSE 'no' END)

我还将这个 CASE 语句添加到 Group by Clause 中,它起作用了。感谢大家。呼!!!结果是准确的。

于 2016-05-02T03:02:19.173 回答