ORA-00907 Ошибка при использовании аналитической функции в запросе (PS / Query, Peopletools 8.51.12) - PullRequest
1 голос
/ 10 января 2012

Запрос выдает ошибку ORA-00907, когда я пытаюсь вставить список значений в критерии.

Фон : Я не разработчик, я просто конечный пользователь, который достаточно изучен, чтобы писать запросы с помощью PS / Query в Peoplesoft, для реализации моей компании. Я работаю с модулем Peoplesoft FSCM (Финансы и управление цепями поставок), в настоящее время на версии FSCM 8.90.08.024, используя, я думаю, Oracle 11g в качестве базовой базы данных.

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

Я должен отметить, что я не могу напрямую писать операторы SQL в Запросите базу данных. Я должен использовать встроенную программу под названием «PS / Query» (также известный как Query Manager) с графическим интерфейсом, который пишет SQL для вас и сохраняет его как запрос, который вы можете запустить в базу данных для извлечения данные. Это относится к моему вопросу только в том, что:

1. I cannot create or alter views/tables
2. I cannot perform any type of SQL Statement except "SELECT"
3. I can embed PL/SQL, MetaSQL and plain SQL into Expressions
4. At this point, Query Manager is the only option I have.

PS / Query - мой единственный опыт работы с SQL, кроме Oracle документация и сайты вроде этого. Из моего исследования это считается чрезвычайно ограничен "фактическими" программистами SQL. Ограничения на это требовать от вас действий, которые нарушают то, что кажется лучшие практики SQL-кодирования.

Запрос запроса: У меня есть запрос, который мне было предложено написать, который вытягивает расходы (на ваучеры и PO) на определенные системные Коды категорий. То, что я пытаюсь сделать, это получить удостоверения личности ваучера, суммировать количество товаров на них по продавцу и коду категории, и отображать результаты, достижения. Или, другими словами, для каждой уникальной комбинации Поставщик / Категория, сложите все суммы ваучеров, которые имеют это Комбинация поставщиков / категорий.

Использование SUM (Fieldname) OVER (PARTITION BY fieldname, fieldname) синтаксис.

Таким образом, конечный результат должен выглядеть примерно так ...

Code     Vendor    Amount
123-45   Acme     $5000.00
123-45   Apple    $4200.00
123-46   Acme     $750.00

С учетом вышесказанного, вот SQL, который Диспетчер запросов отображает для получения набора результатов, который я показал выше:

SELECT DISTINCT D.CATEGORY_CD, D.TN_DESCR1000, C.VENDOR_ID, E.NAME1, SUM ( A.MERCH_AMT_VCHR) OVER (PARTITION BY  D.CATEGORY_CD,  C.VENDOR_ID),E.SETID,E.VENDOR_ID 
  FROM PS_PO_LINE_MATCHED A, PS_PO_LINE B, PS_PO_HDR C, PS_ITM_CAT_TBL D, PS_VENDOR E, PS_PYMNT_VCHR_XREF F 
  WHERE A.BUSINESS_UNIT = B.BUSINESS_UNIT 
     AND A.PO_ID = B.PO_ID 
     AND A.LINE_NBR = B.LINE_NBR 
     AND B.BUSINESS_UNIT = C.BUSINESS_UNIT 
     AND B.PO_ID = C.PO_ID 
     AND D.CATEGORY_ID = B.CATEGORY_ID 
     AND D.EFFDT = 
        (SELECT MAX(D_ED.EFFDT) FROM PS_ITM_CAT_TBL D_ED 
        WHERE D.SETID = D_ED.SETID 
          AND D.CATEGORY_TYPE = D_ED.CATEGORY_TYPE 
          AND D.CATEGORY_CD = D_ED.CATEGORY_CD 
          AND D.CATEGORY_ID = D_ED.CATEGORY_ID 
          AND D_ED.EFFDT <= SYSDATE) 
     AND ( F.SCHEDULED_PAY_DT >= TO_DATE('2010-07-01','YYYY-MM-DD') 
     AND F.SCHEDULED_PAY_DT <= TO_DATE('2011-06-30','YYYY-MM-DD')) 
     AND D.CATEGORY_CD LIKE :1 
     AND E.VENDOR_ID = C.VENDOR_ID 
     AND A.BUSINESS_UNIT = F.BUSINESS_UNIT 
     AND A.VOUCHER_ID = F.VOUCHER_ID 
  ORDER BY 1

Основная проблема: Это прекрасно работает, но может запрашивать только один Код категории за раз. Коды категорий - 5 цифр, 3 цифры «Класс», за которым следует тире, а затем 2-значный подкласс. У меня есть список из 375 кодов категорий, для которых мне нужно получить результат запроса.

Я настроил запрос для этой версии, который позволяет вводить подстановочный знак (Так 123 - %%), но это все еще около ста отдельных прогонов Запрос. Диспетчер запросов позволяет использовать тип выражения «В списке» в Критерии, но для этого необходимо вручную ввести каждую запись в список.

Я пытаюсь установить его так, чтобы я мог вставить открытую копию Список кодов в выражении, с правильными кавычками / запятыми, и иметь его оцените это, чтобы дать мне объединенный список всех кодов NIGP указано. Поле Prompt, созданное Query Manager, не позволяет вставка списков (насколько я знаю).

Попытка решения: Я просмотрел страницу на http://peoplesoft.ittoolbox.com/groups/technical-functional/peoplesoft-other-l/create-an-expression-in-psoft-90-query-to-paste-a-list-of-emplids-2808427 и попробовал некоторые ответы, приведенные там, но ни один из них не сработал. На этой странице я попробовал этот модифицированный SQL (очевидно, список кодов немного урезан для отображения здесь):

SELECT DISTINCT D.CATEGORY_CD, D.TN_DESCR1000, C.VENDOR_ID, E.NAME1, SUM (  A.MERCH_AMT_VCHR) OVER (PARTITION BY  D.CATEGORY_CD,  C.VENDOR_ID),E.SETID,E.VENDOR_ID 
  FROM PS_PO_LINE_MATCHED A, PS_PO_LINE B, PS_PO_HDR C, PS_ITM_CAT_TBL D, PS_VENDOR E,  PS_PYMNT_VCHR_XREF F 
  WHERE A.BUSINESS_UNIT = B.BUSINESS_UNIT 
     AND A.PO_ID = B.PO_ID 
     AND A.LINE_NBR = B.LINE_NBR 
     AND B.BUSINESS_UNIT = C.BUSINESS_UNIT 
     AND B.PO_ID = C.PO_ID 
     AND D.CATEGORY_ID = B.CATEGORY_ID 
     AND D.EFFDT = 
        (SELECT MAX(D_ED.EFFDT) FROM PS_ITM_CAT_TBL D_ED 
        WHERE D.SETID = D_ED.SETID 
          AND D.CATEGORY_TYPE = D_ED.CATEGORY_TYPE 
          AND D.CATEGORY_CD = D_ED.CATEGORY_CD 
          AND D.CATEGORY_ID = D_ED.CATEGORY_ID 
          AND D_ED.EFFDT <= SYSDATE) 
     AND ( F.SCHEDULED_PAY_DT >= TO_DATE('2010-07-01','YYYY-MM-DD') 
     AND F.SCHEDULED_PAY_DT <= TO_DATE('2011-06-30','YYYY-MM-DD')) 
     AND D.CATEGORY_CD = '005-00' OR  D.CATEGORY_CD IN ('015-00,'' '015-06,'' '015-10,'' '615-07'') 
     AND E.VENDOR_ID = C.VENDOR_ID 
     AND A.BUSINESS_UNIT = F.BUSINESS_UNIT 
     AND A.VOUCHER_ID = F.VOUCHER_ID 
  ORDER BY 1

И приведенный выше SQL дает мне ошибку ORA-00907. Кто-нибудь сталкивался с этой проблемой раньше? Массивная стена текста, я знаю. Мои извенения. Это мой первый пост здесь, и я стараюсь не пропустить ничего актуального.

У меня есть непосредственная проблема, которая подтолкнула этот вопрос, но этот запрос - только верхушка очень большого айсберга, и в какой-то момент мне нужно найти способ вставить списки открытого текста в качестве критериев с помощью диспетчера запросов, желательно таким образом, чтобы это хорошо сочеталось с аналитической группировкой.

TL; версия DR:

Использование Peoplesoft Query Manager для создания аналитической суммы с группировкой, используя OVER, PARTITION BY.Когда я пытаюсь вставить список в критерии, выдается ошибка ORA-00907.

Любая помощь будет принята с благодарностью.Спасибо!

Ответы [ 4 ]

2 голосов
/ 14 августа 2012

Хорошо, после некоторой дополнительной настройки я обнаружил, по-моему, основную проблему.

Ошибка в этом случае двоякая. Частично это была моя ошибка (я не проверял, чтобы Peoplesoft искажал кавычки, которые я вытащил из Word), и отчасти это было из-за того, как Query Manager интерпретирует некоторые виды функций (некоторые вещи нужно заключить в оператор Case When чтобы его правильно оценили).

Сначала часть "Моя ошибка":

Каждый раз, когда я вставлял в свой список тестовых кодов NIGP, я делал это из файла, который хранил в Microsoft Word.

Имеет, вероятно, удобную функцию "заменять прямые кавычки умными кавычками". Peoplesoft сходит с ума, когда представляет «умную цитату», и отображает их в виде перевернутых вопросительных знаков (вероятно, есть технический термин, я его не знаю).

Поэтому, когда я проверял предложения (например, исправлял порядок кавычек / запятых, предложенный @Rene Nyffenegger и @WayneH), я начинал с базового тестового запроса, добавлял выражения и проверял его, сохраняя его как отдельный запрос. Если бы они не работали, я бы вернулся к базовому запросу. Таким образом, я мог бы повторять изменения и сохранять потенциальные тесты как разные версии.

Моя ошибка заключалась в том, что я не сохранял разные версии, не оставлял приложение и не возвращался обратно. Когда вы сохраняете запрос, покидаете страницу, идете куда-то еще в Peoplesoft, а затем снова открываете Query Manager, он действительно показывает вам что он делает преобразование символов. Вы не сможете увидеть это, если не сделаете этого. Хотя Query Manager делает это. Поэтому он бросал персонажа, которого менеджер запросов не мог бы распознать, но не показывал мне персонажа, которого он не узнает

Недавно я получил новый рабочий компьютер и теперь отключил автозамену Smart Quotes для будущего использования.

Во-вторых, «Менеджер запросов»: часть:

В версии этого, которую я получил, я использовал обертывание функции "IN" внутри оператора Case. Я обнаружил, что многие функции SQL, когда используются «простые» (как я определил бы их путем простого вставки копий со страниц определений Oracle и заполнения соответствующих переменных), обычно вызывают изжогу из PS / Query (Query Manager). , Но если вы поместите их в оператор CASE ... WHEN ... END, который оценивает результат функции, а затем создадите критерий, который выбирает на основе определенных значений этого результата, функция будет работать и правильно отображать результат.

Так, например, настройте это выражение (как в примере из @ qyb2zm302). Я использую коды, отличные от того, что был в моем исходном примере, но они работают одинаково (все они пятизначные, символьные коды, состоящие из трех цифр, тире, а затем двух цифр)

Case when  E.CATEGORY_CD  IN
                  ('375-15', '375-30', '375-54', '375-60', '380-30','938-63') 
    then 'true' 
    else 'false' 
    end 

А затем установить критерий:

    AND 
        Case when  E.CATEGORY_CD  IN
                  ('375-15', '375-30', '375-54', '375-60', '380-30','938-63') 
                   then 'true' 
                   else 'false' 
        end 
   = 'true'

Он будет выполнен до конца и вернет все строки, имеющие этот код категории.

Если вы не хотите этого делать, вы можете сделать это, как в методе @ qyb2zm302. Единственный недостаток этого в Query Manager - это то, что вам нужно вводить их в отдельные строки в «Списке», и если вы можно копировать-вставлять только 25 одновременно.

Оборачивая его в Case Statement, вы можете вставить его непосредственно в Expression, что намного лучше для больших списков.

Решения:

Выше приведен код, с которым я работал. Ради упрощения это немного упрощает, но это работает.

  1. В списке работает через встроенную опцию диспетчера запросов, пока вы вручную заполняете список

  2. D.CATEGORY_CD = '005-00' ИЛИ ​​ работает до тех пор, пока вы включаете его в описание дела

  3. D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07') работает до тех пор, пока вы его оборачиваете в Изложение дела

  4. Peoplesoft ненавидит умные цитаты. Ничто из вышеперечисленного не сработает, если вы копируете кавычки непосредственно из Word, но вы не увидите его, если не сохраните, не выйдете и не вернетесьтот же запрос в режиме редактирования

  5. Форматирование важно. Все вышеперечисленное требует правильного форматирования запятой / цитаты, как указали Рене и Уэйн.Значение: ('xxx-xx', 'xxx-01', 'xxx-02') и т. Д.

Спасибо всем, кто помогал в этом!Я не думаю, что у меня была такая сложная работа по любому вопросу, но я думаю, что это часть процесса обучения.Поскольку все опубликованные ответы являются правильными и правильными (или, по крайней мере, частью более крупного «правильного»), я собираюсь отметить их все.

1 голос
/ 11 января 2012

The

 D.CATEGORY_CD IN ('015-00,'' '015-06,'' '015-10,'' '615-07'') 

часть выглядит подозрительно для меня

Так как '' в строке "оценивает" в один ', первая строка -

'015-00,'' '

, за которым следует (не строка)

015-06,

Следующее '', вероятно, является тем, на что натыкается парсер, поскольку оно довольно бессмысленно.

Редактировать Попробуйте с D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07').

0 голосов
/ 09 апреля 2012

Следуя ссылке, которую вы разместили , я вижу 2 способа сделать то, что вы пытаетесь выполнить.Я также заметил, что вы попробовали третий метод.

  • Метод 1

    • Критерии> Добавить критерии
    • ВыражениеТип: символ
    • длина: 255
    • Текст выражения: D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07')И 1
    • Тип условия: равно
    • Константа: 1
  • Метод 2

    • Критерии> Добавить критерии
    • Поле: D.CATEGORY_CD
    • Тип условия: в списке
    • Значение: 015-00 ',' 015-06 ','015-10 ',' 615-07
  • Метод 3 (Ваш метод)

    • Критерии> Добавить критерии
    • Поле: D.CATEGORY_CD
    • Тип условия: равно
    • Определить выражение: '015-00' ИЛИ ​​D.CATEGORY_CD IN ('015-00', '015-06 ',' 015-10 ',' 615-07 ')

Вопрос) Совпадает ли нижеследующее с текстом, который вы вводите в поле выражения?

'015-00' ИЛИ ​​D.CATEGORY_CDIN ('015-00', '015-06', '015-10', '615-07')

Если нет, что вы кладете в эту коробку?

0 голосов
/ 12 января 2012

Я думаю, что критерии D.CATEGORY_CD вызывают у вас проблемы, я изменил двойные кавычки на одинарные, а потом мне все еще показалось странным. Затем я замечаю запятые внутри ваших кавычек, а не между ними, попробуйте сделать так, чтобы одна строка критериев выглядела так:

перед:

OR  D.CATEGORY_CD IN ('015-00,'' '015-06,'' '015-10,'' '615-07'')

после

OR  D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07')

Кроме того, «IN» является подразумеваемым «ИЛИ», и я не уверен, есть ли у вас круглые скобки вокруг двух D.CATEGORY_CD, Я бы просто поместил один дополнительный код в критерии IN и удалил строку "D.CATEGORY_CD =":

перед:

AND D.CATEGORY_CD = '005-00' OR  D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07') 

после

AND D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07', '005-00')

Конечно, вы уже заказываете по CATEGORY_CD, вы можете удалить этот критерий и вытащить все категории за один прогон (то есть, если для Excel не слишком много строк), а затем вы можете захотеть добавить либо VENDOR_ID, либо NAME1. в предложении ORDER BY.

Надеюсь, это поможет вам.

...