Правильная форма - listagg с оператором case

Я получаю сообщение об ошибке: ORA-00907: missing right parenthesis, но не могу найти не то.

(select listagg(sp.name
||' : '||
(case when count(distinct sp.name) < 1 then NULL else szf.piece END) as cou_1, ',') 
WITHIN GROUP (ORDER BY sp.name,cou_1)
from sk_positions sp, sk_stock_f SZF, sk_stock SZ 
where SZF.CODE_ID =SK.ID AND SP.RID = SZF.RID_U AND SZF.ID_SZ = SZ.ID
and sp.sk_u = (%sk%) and SZF.piece != 0)

Думаю, у меня проблема в listagg - case.


person Georgy    schedule 17.01.2019    source источник
comment
Подсчитайте (и). Такое же количество?   -  person jarlh    schedule 17.01.2019
comment
Совет сегодня: переходите на современный явный JOIN синтаксис. Легче писать (без ошибок), легче читать (и поддерживать) и при необходимости проще преобразовать во внешнее соединение.   -  person jarlh    schedule 17.01.2019
comment
Что такое sk, нет таблицы с псевдонимом sk.   -  person Barbaros Özhan    schedule 17.01.2019
comment
@ BarbarosÖzhan это текущая таблица (элементы SK), где я ... это внутренний запрос в entrp. программа (что-то вроде SAP ...)   -  person Georgy    schedule 17.01.2019


Ответы (2)


Ошибка здесь:

szf.piece END) as cou_1
               ^

Вы не можете использовать псевдоним подвыражения, а только для полного выражения для столбца. В Listagg оно должно появиться после завершения within group ().

что-то вроде этого

WITHIN GROUP (ORDER BY sp.name,cou_1) as cou_1
person Kaushik Nayak    schedule 17.01.2019

Это запрещено в Oracle. В критериях поиска с подстановочными знаками отсутствуют одинарные кавычки.

sp.sk_u = (%sk%)

Ниже приведен правильный синтаксис (только LIKE работает с таким поиском по критериям, но не =)

sp.sk_u LIKE ('%sk%')

Полный запрос должен быть таким, как показано ниже

(select listagg(sp.name ||' : '||(case when count(distinct sp.name) < 1 
                                       then NULL 
                                       else szf.piece 
                                       END) as cou_1, ',') 
WITHIN GROUP (ORDER BY sp.name,cou_1)
from sk_positions sp, sk_stock_f SZF, sk_stock SZ 
where SZF.CODE_ID =SK.ID
      AND SP.RID = SZF.RID_U 
      AND SZF.ID_SZ = SZ.ID
      and sp.sk_u LIKE ('%sk%') 
      and SZF.piece != 0)

person Muhammad Waheed    schedule 17.01.2019
comment
Извините, но если вы удалите его из предложения where (sp.sk_u = (%sk%)), вы получите ту же ошибку .. - person Georgy; 17.01.2019
comment
Я добавил полное решение при редактировании ответа. Проверить это еще раз - person Muhammad Waheed; 17.01.2019
comment
Проверьте, пожалуйста, если вы мне не верите, скомпилирован - person Georgy; 17.01.2019
comment
Поделитесь желаемым результатом, который необходимо сгенерировать - person Muhammad Waheed; 17.01.2019