2015-11-05 55 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 

我不斷收到錯誤「FROM沒有找到預期的關鍵字」。我不確定我的語法有什麼問題。我正在嘗試查看哪個帳戶(具有多個具有相同名稱的亞馬遜)具有最多的訂購商品。有沒有另一種方法來找到這些信息?我的代碼中有什麼錯誤?

非常感謝您的幫助!

+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

眼前的問題是ROWa 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子句中添加一個tie-braker來實現。如果您想顯示兩者,請改爲使用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

我完成我的查詢,希望爲你工作。 –