2010-11-05 87 views
6

Hãy nói rằng tôi cóChọn cột dựa trên tổng của cột khác

SalesManagerId, SaleAmount, ProductId 

Tôi muốn tổng hợp các SaleAmount cho mỗi (SalesManagerId, ProductId) và lấy ProductId với tối đa sum(SaleAmount).

Điều này có thể trong một truy vấn không?

Ví dụ:

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 

kết quả:

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

Ok, sau khi back-và- trong bài viết của tôi cuối cùng tôi nhận ra những gì bạn đang yêu cầu. Bạn nói rằng bạn muốn "tổng hợp SaleAmount cho mỗi (SalesManagerId, ProductId) và lấy ProductId với số tiền tối đa (SaleAmount)" - bây giờ hãy thêm "cho mỗi SalesManagerId" vào đầu của mệnh đề đó. Không rõ là bạn muốn chính xác một hàng * cho mỗi người quản lý *. –

Trả lời

3

Nếu bạn có chức năng phân tích có sẵn, bạn có thể sử dụng một RANK()

Cái gì như:

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. Đây là nóng! – Monogonator

+0

+1 Tốt hơn những gì tôi đã nấu chín. Một lưu ý: Bạn đang thiếu phần FROM của SELECT bên trong của bạn. –

+0

Cảm ơn Joe. Tôi đã thêm trình giữ chỗ FROM. – Axn

-2

Rất tốt câu hỏi!

Hãy thử điều này:

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

Hoặc cách khác

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

Bạn không thể chỉ cần thả cột sum và nhận CHỈ id sản phẩm

0

Sử dụng GROUP BY và TRÌNH TỰ:

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

Điều này không hoạt động; nó trả về nhiều hàng cho cùng một 'SalesManagerId'. Tôi chỉ muốn một người có tối đa 'SaleSum'. – Monogonator

+0

Xin lỗi, tôi vừa thực hiện chỉnh sửa để thêm "LIMIT 1" vào cuối truy vấn để chỉ trả lại hàng trên cùng. –

+0

'LIMIT 1' không hợp lệ trong T-SQL. (Tôi cần phải có quy định T-SQL trước.) – Monogonator

2

Giả sử ít nhất SQL 2005, do đó bạn có thể sử dụng một 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

Ưu điểm của giải pháp này ở đây là gì: http: // stackoverflow.com/questions/4109622/select-column-based-on-sum-of-khác-cột/4109768 # 4109768 – Monogonator

+0

Giải pháp của Axn vượt trội so với những gì tôi đã nấu ở đây vì nó sẽ hoàn thành nhiệm vụ chỉ với một lần bàn. –

+0

Vẫn hữu ích khi tôi học được điều gì đó mới mẻ! Cảm ơn! – Monogonator

Các vấn đề liên quan