2010-11-05 20 views
6

Diciamo che hoSelezionare la colonna in base a somma di un'altra colonna

SalesManagerId, SaleAmount, ProductId 

voglio riassumere il SaleAmount per ogni (SalesManagerId, ProductId) e prendete la ProductId con la massima sum(SaleAmount).

Questo è possibile in una query?

Esempio:

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 

risultato:

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

Ok, dopo back-e- avanti nel mio post ho finalmente capito cosa stai chiedendo. Hai detto che vuole "riassumere l'ImportoVendita per ogni (SalesManagerId, ProductId) e prendete la ProductId con la somma massima (ImportoVendita)" - ora si prega di aggiungere "per ogni SalesManagerId" all'inizio di tale clausola. Non era chiaro che tu volessi esattamente una riga * per manager *. –

risposta

3

Se si dispone di funzioni analitiche disponibili, è possibile utilizzare un RANK()

Qualcosa di simile:

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. Questo è il caldo! – Monogonator

+0

+1 meglio di quello che ho preparato. Una nota: ti manca la parte FROM del tuo SELECT interno. –

+0

Grazie Joe. Ho aggiunto il segnaposto FROM. – Axn

-2

Molto buona domanda!

Prova questo:

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

Oppure, in alternativa

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

Non si può semplicemente eliminare la colonna somma e ottenere solo il prodotto id

0

Usa GROUP BY e ORDER:

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

Questo non funziona; restituisce più righe per lo stesso 'ID di SalesManager'. Voglio solo quello con il massimo 'SaleSum'. – Monogonator

+0

Mi dispiace, justed fatto una modifica per aggiungere "LIMIT 1" alla fine della query per restituire solo la riga superiore. –

+0

'LIMIT 1' non è valido in T-SQL. (Avrei dovuto specificato T-SQL in anticipo.) – Monogonator

2

Assumendo almeno SQL 2005 in modo da poter utilizzare 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

Quali sono i vantaggi di questo rispetto alla soluzione qui: http: // StackOverflow.it/questions/4109622/select-column-based-on-sum-of-another-column/4109768 # 4109768 – Monogonator

+0

La soluzione di Axn è superiore a quello che ho preparato qui in quanto eseguirà il compito in un unico passaggio sul tavolo. –

+0

Ancora utile come ho imparato qualcosa di nuovo! Grazie! – Monogonator

Problemi correlati