2010-11-05 17 views
6

Digamos que tengoSeleccionar columna en función de suma de otra columna

SalesManagerId, SaleAmount, ProductId 

quiero resumir la SaleAmount para cada uno (SalesManagerId, ProductId) y agarrar el ProductId con el máximo sum(SaleAmount).

¿Es esto posible en una consulta?

Ejemplo:

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 

resultado:

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

Ok, después de back-y- adelante en mi publicación, finalmente me doy cuenta de lo que estás pidiendo. Dijo que desea "resumir el monto de venta para cada uno (ID de productor de ventas, identificador de producto) y obtener la Id. De producto con la suma máxima (Monto de venta)" - ahora agregue "para cada identificador de vendedor" al principio de esa cláusula. No estaba claro si desea exactamente una fila * por gerente *. –

Respuesta

3

If Tiene funciones analíticas disponibles, se puede utilizar una Algo RANK()

como:

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

Wow. Este es el calor! – Monogonator

+0

+1 Mejor de lo que cociné. Una nota: te falta la parte FROM de tu SELECT interno. –

+0

Gracias Joe. He agregado el marcador de posición FROM. – Axn

-2

Muy buena pregunta!

Prueba esto:

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

O, alternativamente

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

No se puede simplemente dejar caer la columna de la suma y obtener sólo el ID de producto

0

Uso GROUP BY y ORDER:

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

Esto no funciona; devuelve varias filas para el mismo 'SalesManagerId'. Solo quiero el que tenga el máximo 'SaleSum'. – Monogonator

+0

Lo siento, justed hizo una edición para agregar "LIMIT 1" al final de la consulta para simplemente devolver la fila superior. –

+0

'LIMIT 1' no es válido en T-SQL. (Debería haber especificado T-SQL por adelantado.) – Monogonator

2

Suponiendo al menos SQL 2005 para que pueda utilizar un 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

¿Cuáles son las ventajas de esto sobre la solución aquí: http: // stackoverflow.com/questions/4109622/select-column-based-on-sum-of-another-column/4109768 # 4109768 – Monogonator

+0

La solución de Axn es superior a lo que he cocinado aquí, ya que logrará la tarea en una sola pasada en el mesa. –

+0

¡Todavía útil cuando aprendí algo nuevo! ¡Gracias! – Monogonator

Cuestiones relacionadas