2016-12-09 4 views
0

Я пытаюсь выбрать строки, где CTN_QUANTITY не пуст. Мой запросORA-00904: «CTN_QUANTITY»: - «% s: недопустимый идентификатор»

select distinct SDB.CTN_MAIN as S_CTN_MAIN, 
    SDB.SUBS_KEY as S_SUBS_KEY, 
    SDB.BAN_KEY as S_BAN_KEY, 
    count(SDB.CTN_MAIN) as CTN_QUANTITY, 
    FPCN.BAN_KEY as BAN_KEY 
from STG_SDB_LOAD SDB, FCT_PREP_CHARGES_N FPCN 
    where FPCN.business_service_key = 33006 
    and CTN_QUANTITY <> '' 
group by SDB.CTN_MAIN, 
    SDB.SUBS_KEY, 
    SDB.BAN_KEY, 
    FPCN.BAN_KEY; 

Я получаю ошибку

ORA-00904. - "%s: invalid identifier" 

Что мне нужно изменить?

ответ

-1

Вы должны использовать IS NOT NULL вместо <>. Также вы не можете использовать псевдоним в статье and.

select a.* from 
    (SELECT DISTINCT SDB.CTN_MAIN AS S_CTN_MAIN, 
        SDB.SUBS_KEY AS S_SUBS_KEY, 
        SDB.BAN_KEY AS S_BAN_KEY, 
        COUNT (SDB.CTN_MAIN) AS CTN_QUANTITY, 
        FPCN.BAN_KEY AS BAN_KEY 
    FROM STG_SDB_LOAD SDB, FCT_PREP_CHARGES_N FPCN 
    WHERE FPCN.business_service_key = 33006 
GROUP BY SDB.CTN_MAIN, 
     SDB.SUBS_KEY, 
     SDB.BAN_KEY, 
     FPCN.BAN_KEY) a 
WHERE a.CTN_QUANTITY IS NOT NULL 

вещи анализировать: Является ли это действительно полезно иметь такое состояние a.CTN_QUANTITY IS NOT NULL. Возможно, вы сможете узнать больше, переустановив на это и рассмотрев предложение @mathguy.

+0

Уже пробовал. и CTN_QUANTITY не равно нулю. тоже не работает. –

+1

Прочтите обновленный ответ. Кроме того, поскольку вы являетесь результатом groupin, нет необходимости в отличии. – XING

+0

@EugeneCuz - Вы уверены, что это необходимое решение? (Возможно, поскольку вы отметили это как правильный ответ.) Я скажу это снова, я также сказал об этом в своем ответе: COUNT НИКОГДА НЕ БУДЕТ НЕУДАЧНО, поэтому это условие также может быть полностью удалено. Вместо этого вы должны проверить, не совпадает ли счет с ZERO (не «NOT NULL»). – mathguy

3

CTN_QUANTITY определяется как псевдоним для выражения в предложении SELECT. Но вы хотите использовать его в предложении WHERE. Это не сработает - WHERE обрабатывается до SELECT. Вам нужно будет использовать count(SDB.CTN_MAIN) в предложении WHERE, а не его псевдоним.

Тогда: Счет всегда является числом, но вы сравниваете его с пустой строкой. Что в Oracle NULL, но независимо, это не имеет смысла. И, COUNT может быть нулевым, он никогда не должен быть NULL.

Возможно, вам необходимо написать WHERE count(....) <> 0.

Редактировать: И, конечно, как обсуждалось в Комментариях ниже ... фильтр COUNT не относится к предложению WHERE, он должен быть в предложении HAVING.

+0

Я тоже пытался использовать count (SDB.CTN_MAIN). но «функция группы здесь не разрешена». –

+1

Справа. Мы решаем проблемы один за другим - это касается вопроса, который вы опубликовали. Теперь: Условие в 'COUNT' должно идти в состоянии' HAVING', а не в состоянии 'WHERE'. Вы можете обнаружить еще больше ошибок - до сих пор у вас уже было четыре. Кто знает. В любом случае, если у вас есть разные вопросы, вы должны спросить их в отдельных сообщениях. – mathguy