2016-10-05 63 views
0

這個問題已經被類似的介紹過了,但是我很掙扎。TSQL Row_Number

我需要找到根據客戶的購買模式前N個銷售..

理想這需要由客戶前N個由個月的時間由一年,但現在我只是在整體看前N D B。

我的查詢是這樣的:

-- QUERY TO SHOW TOP 2 CUSTOMER INVOICES BY CUSTOMER BY MONTH 

SELECT 
    bill_to_code, 
    INVOICE_NUMBER, 
    SUM(INVOICE_AMOUNT_CORP) AS 'SALES', 
    ROW_NUMBER() OVER (PARTITION BY bill_to_code ORDER BY SUM(INVOICE_AMOUNT_CORP) DESC) AS 'Row' 
FROM 
    FACT_OM_INVOICE 
    JOIN dim_customer_bill_to ON FACT_OM_INVOICE.dim_customer_bill_to_key = dim_customer_bill_to.dim_customer_bill_to_key 
--WHERE 
-- 'ROW' < 2 
GROUP BY 
    invoice_number, 
    Dim_customer_bill_to.bill_to_code 

我無法理解給定的限制行= < N.

請幫忙解決方案。

+1

您的查詢看起來並不遙遠。行號將根據訂單對每個組中的記錄進行編號。然後,您可以限制每組的前兩條記錄。 –

+0

你不需要'ROW_NUMBER',只需要'SELECT TOP 2'頂級'ORDER BY' – Dai

回答

1

試試這個。

-- QUERY TO SHOW TOP 2 CUSTOMER INVOICES BY CUSTOMER BY MONTH 
;WITH Top2Customers 
AS 
(
SELECT 
    bill_to_code, 
    INVOICE_NUMBER, 
    SUM(INVOICE_AMOUNT_CORP) AS 'SALES', 
    ROW_NUMBER() OVER (PARTITION BY bill_to_code ORDER BY SUM(INVOICE_AMOUNT_CORP) DESC) 
    AS 'RowNumber' 
FROM 
    FACT_OM_INVOICE 
    JOIN dim_customer_bill_to ON FACT_OM_INVOICE.dim_customer_bill_to_key = dim_customer_bill_to.dim_customer_bill_to_key 
GROUP BY 
    invoice_number, 
    Dim_customer_bill_to.bill_to_code 
) 
SELECT * FROM Top2Customers WHERE RowNumber < 3 
+0

謝謝溼婆!這一個工程。你能解釋'與頂級客戶'的一部分。這是宣佈一個臨時表? –

+0

很酷。是的,'WITH top2customers AS'就像一個臨時表,但更強大。它被稱爲CTE - 公用表表達式。看到這個更多的信息和例子:https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx – Shiva

0

你必須換你選擇到另一個使用()由ROW_NUMBER產生的價值

select * from (
SELECT 
    bill_to_code, 
    INVOICE_NUMBER, 
    SUM(INVOICE_AMOUNT_CORP) AS SALES, 
    ROW_NUMBER() OVER (PARTITION BY bill_to_code ORDER BY SUM(INVOICE_AMOUNT_CORP) DESC) AS RowNo 
FROM 
    FACT_OM_INVOICE 
    JOIN dim_customer_bill_to ON FACT_OM_INVOICE.dim_customer_bill_to_key = dim_customer_bill_to.dim_customer_bill_to_key 
--WHERE 
-- 'ROW' < 2 
GROUP BY 
    invoice_number, 
    Dim_customer_bill_to.bill_to_code 
) base where RowNo < 2 
+0

謝謝1月,但這一個仍然提出了可怕的'轉換失敗當將varchar值'row'轉換爲數據類型int。'時錯誤。 –

+0

我已經從您的示例更改了列名,現在就試試。 –