2016-10-05 4 views
0

이 질문은 이전에 유사하게 다루어졌지만 지금은 어려움을 겪고 있습니다.TSQL Row_Number

내가 고객의 구매 패턴을 기반으로 상위 N 판매를 찾을 필요가

..

이상적이 올해의 달 기간으로 고객이 상위 N 수 있어야하지만 지금 난 그냥 전체에 걸쳐 상위 N 찾고 있어요 DB.

-- 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 '는 필요하지 않습니다. 최상위'ORDER BY'를 가지고'SELECT TOP 2' 만하십시오. – 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

감사합니다! Shiva! 이 하나의 작품. top2customers as '부분을 설명해 주시겠습니까? 이 임시 테이블을 선언하고 있습니까? –

+0

차가움. 예, 'WITH top2customers AS'는 임시 테이블과 같지만 더 강력합니다. 이를 CTE - Common Table Expression이라고합니다. 자세한 정보와 예를 보려면 다음을 참조하십시오. 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

감사합니다.하지만이 사람은 여전히 ​​두려운 'Conversion failed varchar 값 'row'를 데이터 유형 int로 변환 할 때. 오류. –

+0

샘플에서 컬럼 이름을 변경했습니다. 지금 시도하십시오. –