2015-11-05 3 views
-1

Вот код, у меня есть:У вашего аккаунта? SQLdev

SELECT account_name, 
    count(ordered_item), 
    ROW_NUMBER() OVER (
     PARTITION BY account_name, ordered_item 
     ORDER BY count(ordered_item) DESC 
     ) Row 
FROM oe_order_lines_all ool, 
    cust_accounts_all hca, 
    oe_order_headers_all ooh 
WHERE to_date(ooh.creation_date) BETWEEN '2015-10-01' AND '2015-10-31' 
    AND ooh.flow_status_code <> 'CANCELLED' 
    AND ooh.sys_document_ref = ool.sys_document_ref 
    AND hca.cust_account_id = ooh.org_id 
GROUP BY hca.account_name, 
    ool.ordered_item 
ORDER BY ool.ordered_item DESC 

я получаю ошибку «от ключевого слова не найден там, где ожидалось». Я не уверен, что не так с моим синтаксисом. Я пытаюсь увидеть, какая учетная запись (есть несколько с тем же именем, то есть Amazon) имеет самые упорядоченные элементы. Есть ли другой способ найти эту информацию? Какая ошибка в моем коде?

Заранее благодарю за помощь!

+0

Узнайте, как использовать явный синтаксис объединения. Аарон Бертран сделал несколько [** текст] ** (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) об этом –

+0

Спасибо за ссылку. Я узнаю больше о том, как правильно присоединиться к таблицам. К сожалению, это не проблема. – applesandgrapes

+0

Замените 'Row' другим именем (может быть« ROW »внутри кавычек). «ROW» - зарезервированное ключевое слово в Oracle. – krokodilko

ответ

1

Непосредственная проблема заключается в том, что ROW является a reserved word. Если вы измените этот псевдоним столбца на другое, ошибка исчезнет.

Но вы, вероятно, хотите подзапрос, чтобы получить количество для каждого имени учетной записи, а затем применить аналитическую функцию к результату, что - без пункта PARTITION BY, который бы ранжировать все то же самое:

SELECT account_name, ordered_items, 
    ROW_NUMBER() OVER (
     ORDER BY ordered_items DESC 
    ) rn 
FROM (
    SELECT hca.account_name, 
    count(ordered_item) ordered_items 
    FROM oe_order_headers_all ooh 
    JOIN oe_order_lines_all ool 
    ON ooh.sys_document_ref = ool.sys_document_ref 
    JOIN cust_accounts_all hca 
    ON hca.cust_account_id = ooh.org_id 
    WHERE to_date(ooh.creation_date) BETWEEN DATE '2015-10-01' AND DATE '2015-10-31' 
    AND ooh.flow_status_code <> 'CANCELLED' 
    GROUP BY hca.account_name 
) 
ORDER BY rn DESC; 

И если вы хотите только один с наибольшим кол вы можете иметь дополнительный уровень:

SELECT account_name, ordered_items 
FROM (
    SELECT account_name, ordered_items, 
    ROW_NUMBER() OVER (
     ORDER BY ordered_items DESC 
     ) rn 
    FROM (
    SELECT hca.account_name, 
     count(ordered_item) ordered_items 
    FROM oe_order_headers_all ooh 
    JOIN oe_order_lines_all ool 
    ON ooh.sys_document_ref = ool.sys_document_ref 
    JOIN cust_accounts_all hca 
    ON hca.cust_account_id = ooh.org_id 
    WHERE to_date(ooh.creation_date) BETWEEN DATE '2015-10-01' AND DATE '2015-10-31' 
    AND ooh.flow_status_code <> 'CANCELLED' 
    GROUP BY hca.account_name 
) 
) 
WHERE rn = 1; 

Но ROW_NUMBER() не может быть уместным здесь. Вы не указали, что должно произойти, если две учетные записи имеют одинаковый счет. Если вы хотите показать только один из них, вам нужно выбрать способ использования, который вы можете сделать, добавив привязку к функции ORDER BY. Если вы хотите показать оба, используйте вместо этого RANK().

(Я также перешел на ANSI присоединяется и использованные литералы, так что вы не полагаться на настройках NLS.)

SQL Fiddle demo.

+0

Я тоже на этом тоже, но в sqlfiddle ничего не сказал –

+0

Даже после переименования я все равно получаю ту же ошибку. Я также попытался добавить цитаты, и это не сработало. – applesandgrapes

+0

Что вы переименовали? –

1

Я думаю, что нужно выполнить подзапрос

SELECT account_name, 
     ordered_item, 
     ROW_NUMBER() OVER (ORDER BY Total DESC) as rn 
FROM (
    SELECT hca.account_name, 
      ool.ordered_item, 
      COUNT(*) as total 
    FROM oe_order_lines_all ool 
    JOIN oe_order_headers_all ooh 
     ON ooh.sys_document_ref = ool.sys_document_ref  
    JOIN cust_accounts_all hca 
     ON hca.cust_account_id = ooh.org_id 
    WHERE to_date(ooh.creation_date) BETWEEN '2015-10-01' AND '2015-10-31' 
     AND ooh.flow_status_code <> 'CANCELLED'  
    GROUP BY 
      hca.account_name, 
      ool.ordered_item 
    ) T 
ORDER BY ordered_item DESC 
+0

Я завершу свой запрос, надеюсь, что работа для вас. –

Смежные вопросы