2016-10-05 60 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

我已经从您的示例更改了列名,现在就试试。 –