2016-10-05 5 views
0

Diese Frage wurde in ähnlicher Weise behandelt, ABER ich habe Probleme.TSQL Row_Number

I Top-N Umsatz basierend auf Kaufverhalten der Kunden ..

ideal muss dies sein Top-N durch den Kunden nach Monat Zeitraum von Jahr finden müssen, aber für jetzt bin ich einfach nur an der Spitze N über die gesamte DB.

Meine Anfrage wie folgt aussieht:

-- 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 

ich nicht die Lösungen Row zu beschränken gegeben verstehen kann = < N.

Bitte helfen.

+1

Ihre Anfrage nicht weit weg sieht. Die Zeilennummer nummeriert die Datensätze in jeder Gruppe gemäß einer Bestellung. Sie können dann auf die ersten beiden Datensätze aus jeder Gruppe beschränken. –

+0

Sie brauchen nicht 'ROW_NUMBER', nur' SELECT TOP 2' mit einem TOP-Level 'ORDER BY' – Dai

Antwort

1

Versuchen Sie dies.

-- 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

Danke Shiva! Dieser funktioniert. Können Sie den 'with top2customers as' Teil erklären? Wird eine temporäre Tabelle deklariert? –

+0

Kühl. Ja, das 'WITH top2customers AS' ist wie eine temporäre Tabelle, aber leistungsfähiger. Es heißt CTE - Common Table Expression. Sehen Sie das für mehr Info und Beispiele: https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx – Shiva

0

Sie haben Ihre Auswahl in eine andere wickeln von row_number erzeugt den Wert zu verwenden()

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

Dank Jan, aber dieses ist immer noch mit der gefürchteten 'Konvertierung fehlgeschlagen beim Konvertieren des Varchar-Wertes 'row' in den Datentyp int. ' Error. –

+0

Ich habe die Spaltennamen aus Ihrer Probe geändert, versuchen Sie es jetzt. –