SQL 服务器:根据其他列的 MAX(SUM()) 获取列

SQL Server : get columns based on MAX(SUM()) of other column

我 运行 在尝试根据列总和的最大值来 select 列时遇到了麻烦。我正在使用 SQL 服务器。

我有以下三个表格(简体)

维度表

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

供应商表

SupplierID SupplierNo
1 102030
2 203040
3 304050

我想做的是 select SupplierNoProductCategory 基于列 Revenue 的最高总和,对于每个 Supplier .

我想我已了解此查询的“第一级”,但需要帮助实际过滤 Revenue 不是 MAX(SUM)) 的行。现在,它返回 MAX(SUM(Revenue)) 但同时按 SupplierNoProductCategory.

分组

当前查询是:

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;

想要的结果:

SupplierNo ProductCategory MAX(SUM(Revenue))
102030 Category2 3000
203040 Category3 1600
304050 Category4 700

因此,对于每个不同的 SupplierNo,我希望 ProductCategory 具有最高值 MAX(SUM(Revenue)),并且我希望从查询中返回所有三列。

您可以根据需要使用 ROW_NUMBER(),您的查询如下:

SELECT *
FROM (
    SELECT SupplierNo
        ,ProductCategory
        ,SUM(Revenue) AS Revenue
        ,ROW_NUMBER() OVER (
            PARTITION BY SupplierNo ORDER BY SUM(Revenue) DESC
            ) AS rn
    FROM DimensionTable d
    INNER JOIN ProductTable p ON d.ProductID = p.ProductID
    INNER JOIN SupplierTable s ON s.SupplierID = d.SupplierID
    GROUP BY SupplierNo
        ,ProductCategory
    ) a
WHERE rn = 1