2016-04-29 3 views
-1

Запрос работает без утверждения кейса. После того, как я добавлю оператор CASE, Получение ORA-00979 (не выражение GROUP BY) для запроса ниже (потому что я не добавлял оператор case в предложение GROUP BY). После того, как я попробовал (добавив в группу By), я получил ORA-22818 (здесь не разрешены выражения подзапроса). Какие-либо предложения?ORA-00979 ORA-22818

Примечание: все левые внешние соединения относятся к справочным таблицам Таблица: 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); 
+0

Не зная свою модель, есть ли причина, по которой вы не присоединяетесь к «lpyr» со всеми остальными таблицами? Затем просто сравните значения в вашем случае. –

+1

ИЗОБРАЖИТЕ СВОЙ КВАЛИФИКАЦИЮ и укажите точный текст сообщений об ошибках, которые вы видите. Благодарю. –

+0

Если вы группируете каждый столбец результатов, вы можете просто удалить группу «by by» и добавить «distinct». Это было бы короче и легче понять. Конечно, возможно, вы не хотели ставить 'count (dkey)' в 'group by', потому что наличие агрегатных функций в группе кажется очень контрпродуктивным. – Andreas

ответ

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) 
+0

Спасибо Pham X. Пробовал это. Не работал. Такая же ошибка. – SKINNY

+0

Изображение, что если вы закомментируете весь оператор case, запрос будет успешным. – SKINNY

0

Спасибо за вход ребята. Я смог понять это, используя немного каждого отзыва от вас. Я в значительной степени удалил lpyr из футляра и поместил его как другое левое внешнее соединение в инструкции from.

Тогда я заменил оператор CASE, с: (СЛУЧАЙ ПРИ PG.rite_ts < = lpyr.pssd_dt
THEN 'РЕКТИФИЦИРОВАННЫЙ' ELSE 'нет' END)

Я также добавил этот случай заявление Группа за пунктом, и это сработало. Всем спасибо. Уф !!! Результаты являются точными.