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 SupplierNo
和 ProductCategory
基于列 Revenue
的最高总和,对于每个 Supplier
.
我想我已了解此查询的“第一级”,但需要帮助实际过滤 Revenue
不是 MAX(SUM))
的行。现在,它返回 MAX(SUM(Revenue))
但同时按 SupplierNo
和 ProductCategory
.
分组
当前查询是:
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
我 运行 在尝试根据列总和的最大值来 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 SupplierNo
和 ProductCategory
基于列 Revenue
的最高总和,对于每个 Supplier
.
我想我已了解此查询的“第一级”,但需要帮助实际过滤 Revenue
不是 MAX(SUM))
的行。现在,它返回 MAX(SUM(Revenue))
但同时按 SupplierNo
和 ProductCategory
.
当前查询是:
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