2010-11-05 5 views
6

Допустим, у меня естьВыберите столбец на основе суммы другого столбца

SalesManagerId, SaleAmount, ProductId 

Я хочу подвести итог SaleAmount для каждого (SalesManagerId, ProductId) и захватить ProductId с максимальной sum(SaleAmount).

Возможно ли это в одном запросе?

Пример:

1, 100, 1 
1, 200, 1 
1, 600, 1 
1, 400, 2 
2, 100, 3 
3, 100, 4 
3, 100, 4 
2, 500, 6 
3, 100, 5 

результат:

1, 900, 1 
2, 500, 6 
3, 200, 4 
+0

Хорошо, после того, как обратно-and В моем посте я наконец понимаю, о чем вы просите. Вы сказали, что хотите «подвести итог SaleAmount для каждого (SalesManagerId, ProductId) и захватить ProductId с максимальной суммой (SaleAmount)» - теперь добавьте «для каждого SalesManagerId» в начало этого предложения. Непонятно, что вы хотите ровно одну строку * за менеджера *. –

ответ

3

Если у вас есть аналитические функции доступны, вы можете использовать RANK()

Что-то вроде:

SELECT SalesManagerId, ProductId, Total 
FROM (
    SELECT SalesManagerId, 
     ProductId, 
     SUM(SaleAmount) as Total, 
     RANK() OVER(PARTITION BY SalesManagerId 
        ORDER BY SUM(SaleAmount) DESC) as R 
    FROM <Table name> 
    GROUP BY SalesManagerId, ProductId) as InnerQuery 
WHERE InnerQuery.R = 1 
+0

Ничего себе. Это горячая! – Monogonator

+0

+1 Лучше, чем я приготовил. Одна заметка: вам не хватает части FROM вашего внутреннего SELECT. –

+0

Спасибо, Джо. Я добавил местозаполнитель FROM. – Axn

-2

Очень хороший вопрос!

Попробуйте это:

SELECT MAX(SUM(SaleAmount)), ProductId GROUP BY SalesManagerId, ProductId; 

или в качестве альтернативы

SELECT SUM(SaleAmount) as Sum, ProductId GROUP BY SalesManagerId, ProductId ORDER BY Sum DESC; 

Вы не можете просто бросить столбец суммы и получить только идентификатор продукта

0

Использование GROUP BY и ORDER:

SELECT SalesManagerId, SUM(SaleAmount) AS SaleSum, ProductId FROM [table-name] GROUP BY SalesManagerId, ProductId ORDER BY SaleSum DESC 
+0

Это не работает; он возвращает несколько строк для одного и того же 'SalesManagerId'. Я хочу только один с max 'SaleSum'. – Monogonator

+0

Извините, я сделал редактирование, чтобы добавить «LIMIT 1» в конец запроса, чтобы просто вернуть верхнюю строку. –

+0

'LIMIT 1' недопустим в T-SQL. (Я должен был заранее указать T-SQL.) – Monogonator

2

Предполагая, что по крайней мере SQL 2005, так что вы можете использовать CTE:

;with cteTotalSales as (
    select SalesManagerId, ProductId, SUM(SaleAmount) as TotalSales 
     from YourSalesTable 
     group by SalesManagerId, ProductId 
), 
cteMaxSales as (
    select SalesManagerId, MAX(TotalSales) as MaxSale 
     from cteTotalSales 
     group by SalesManagerId 
) 
select ts.SalesManagerId, ms.MaxSale, ts.ProductId 
    from cteMaxSales ms 
     inner join cteTotalSales ts 
      on ms.SalesManagerId = ts.SalesManagerId 
       and ms.MaxSale = ts.TotalSales 
    order by ts.SalesManagerId 
+0

Каковы преимущества этого решения: http: // stackoverflow.com/questions/4109622/select-column-on-sum-of-another-column/4109768 # 4109768 – Monogonator

+0

Решение Axn превосходит то, что я приготовил здесь, так как он выполнит задачу за один проход на Таблица. –

+0

Все еще полезно, когда я узнал что-то новое! Благодаря! – Monogonator

Смежные вопросы