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

Я не могу понять, соответствующие решения, чтобы ограничить строки к = < Н.

Пожалуйста, помогите.

+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

Спасибо Shiva! Это работает. Можете ли вы объяснить часть «top2customers as». Это объявление временной таблицы? –

+0

Прохладный. Да, 'С 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

Спасибо, Ян, но этот еще по-прежнему приходит с ужасным «Ошибка конверсии» при преобразовании значения varchar 'row' в тип данных int. ' ошибка. –

+0

Я изменил имена столбцов из вашего образца, попробуйте сейчас. –