I've ran into trouble trying to select columns based on the max of a sum of a column. I'm using SQL Server.
I have the following three tables (simplified)
DimensionTable
| SupplierID | ProductID | Revenue |
|---|---|---|
| 1 | 1 | 500 |
| 1 | 2 | 2000 |
| 1 | 3 | 3000 |
| 2 | 4 | 500 |
| 2 | 5 | 700 |
| 2 | 6 | 900 |
| 3 | 7 | 300 |
| 3 | 8 | 400 |
| 3 | 9 | 500 |
ProductTable
| ProductID | ProductCategory |
|---|---|
| 1 | Category1 |
| 2 | Category1 |
| 3 | Category2 |
| 4 | Category1 |
| 5 | Category3 |
| 6 | Category3 |
| 7 | Category4 |
| 8 | Category4 |
| 9 | Category2 |
SupplierTable
| SupplierID | SupplierNo |
|---|---|
| 1 | 102030 |
| 2 | 203040 |
| 3 | 304050 |
What I would like to do is select SupplierNo and ProductCategory based on the highest max sum of the column Revenue, for each Supplier.
I think I have the "first level" of this query down, but need help with actually filtering rows where Revenue isn't MAX(SUM)). Right now, it is returning MAX(SUM(Revenue)) but grouped by both SupplierNo and ProductCategory.
Query currently is:
WITH dim AS
(
SELECT
ProductID,
SupplierID,
SUM(Revenue) AS sumRevenue
FROM
DimensionTable
GROUP BY
ProductID, SupplierID
),
supp AS
(
SELECT
SupplierID,
SupplierNo
FROM
SupplierTable
),
prod AS
(
SELECT
ProductID,
ProductCategory
FROM
ProductTable
)
SELECT
MAX(t1.sumRevenue) AS maxSumRevenue,
t2.SupplierNo,
t3.ProductCategory
FROM
dim t1
LEFT JOIN
supp t2 ON t1.SupplierID = t2.SupplierID
LEFT JOIN
prod t3 ON t1.ProductID = t3.ProductID
GROUP BY
t2.SupplierNo, t3.ProductCategory
ORDER BY
MAX(t1.sumRevenue) DESC;
Desired result:
| SupplierNo | ProductCategory | MAX(SUM(Revenue)) |
|---|---|---|
| 102030 | Category2 | 3000 |
| 203040 | Category3 | 1600 |
| 304050 | Category4 | 700 |
So for each distinct SupplierNo, I want the ProductCategory with the highest value of MAX(SUM(Revenue)), and I want all three columns returned from the query.