SQL 从多列查询 return 最大值
SQL query to return maximum values from multiple columns
我在 SQL Server 2008 R2 数据库中有以下表格:
Customers
=========
CustID CustName
====== ========
0 NULL
1 A
2 B
3 C
InterestingCustomers
====================
CustID
======
0
1
3
Orders
======
CustID OrderID InvoiceTotal Discount
====== ======= ============ ========
0 NULL 2000 NULL
0 100 NULL 500
1 1 100 NULL
1 2 90 15
2 3 300 25
2 4 50 0
3 5 100 10
3 6 200 25
3 7 150 NULL
3 8 120 20
我想要一个查询,显示所有订单中每个 CustID 和 CustName 的 InvoiceTotal 和 Discount 列的最大值,但前提是客户出现在 InterestingCutomers 中并且 ID > 0:
CustID CustName MaxInvoiceTotal MaxDiscount
1 A 100 15
3 C 200 25
我的一个限制是我的应用程序是使用 Jet 4.0 和 ADO 的旧版 VB6。这不支持托管我的数据库的 SQL Server 2008 的许多高级功能。我可用的 SQL 函数列在此处:https://support.microsoft.com/en-us/kb/294698。
到目前为止,我已经能够获得最大的 InvoiceTotal,但我无法扩展相同的查询以达到 return 任何其他列的最大值。
以下正确 return 每个有效 CustID 的最大 InvoiceTotal:
SELECT Customers.CustID, CustName, InvoiceTotal, Discount
FROM ((Customers INNER JOIN Interesting ON Customers.CustID = Interesting.CustID) INNER JOIN Orders ON Customers.CustID = Orders.CustID)
WHERE ((CustID > 0)
AND (InvoiceTotal IN
(SELECT MAX(InvoiceTotal) AS MaxInvoiceTotal
FROM Orders
WHERE Orders.CustID = Customers.CustID)))
Returns:
CustID CustName MaxInvoiceTotal
1 A 100
3 C 200
但是,扩展 WHERE 子句以将 Discount 限制为每个客户的最大值仅 returns 记录,其中 InvoiceTotal 和 Discount 恰好是最大值并且属于同一订单:
WHERE ((CustID > 0) AND (InvoiceTotal IN
(SELECT MAX(InvoiceTotal) AS MaxInvoiceTotal
FROM Orders
WHERE Orders.CustID = Customers.CustID)) AND
Discount IN
(SELECT MAX(Discount) AS MaxDiscount
FROM Orders
WHERE Orders.CustID = Customers.CustID))
Returns:
CustID CustName MaxInvoiceTotal MaxDiscount
3 C 200 25
未选择 CustID 1,因为它的最大 InvoiceTotal 值与其最大折扣值属于不同的订单。我假设这两个条件都针对每个符合条件的订单进行了测试,但我想要一些方法来删除 OrderID 与 InvoiceTotal 和 Discount 之间的关联。 OR-ing 附加子句不起作用。
我怀疑我可能在 UNION
范围内,但想看看是否有更清洁或更有效的方法,考虑到我列出的限制。
SELECT Customers.CustID, CustName, MaxInvoiceTotal, MaxDiscount
FROM Customers
INNER JOIN Interesting ON Customers.CustID = Interesting.CustID
INNER JOIN (SELECT CustID, MAX(Discount) AS MaxDiscount
FROM Orders
Group by CustID) MaxDiscountOrders ON Customers.CustID =
MaxDiscountOrders.CustID
INNER JOIN (SELECT CustID, MAX(InvoiceTotal) AS MaxInvoiceTotal
FROM Orders
Group by CustID) MaxInvoiceTotalOrders ON Customers.CustID
= MaxInvoiceTotalOrders.CustID
WHERE CustID > 0
试试这个。不过我还没有检查语法错误。
SELECT CustID,
CustName = MAX(CustName),
InvoiceTotal = SUM(InvoiceTotal),
Discount = SUM(Discount)
FROM Orders O
INNER JOIN Customers C ON O.CustID = C.CustID
WHERE O.CustID IN (SELECT CustID
FROM InterestingCustomers)
AND O.CustID>0
GROUP BY CustID
我在 SQL Server 2008 R2 数据库中有以下表格:
Customers
=========
CustID CustName
====== ========
0 NULL
1 A
2 B
3 C
InterestingCustomers
====================
CustID
======
0
1
3
Orders
======
CustID OrderID InvoiceTotal Discount
====== ======= ============ ========
0 NULL 2000 NULL
0 100 NULL 500
1 1 100 NULL
1 2 90 15
2 3 300 25
2 4 50 0
3 5 100 10
3 6 200 25
3 7 150 NULL
3 8 120 20
我想要一个查询,显示所有订单中每个 CustID 和 CustName 的 InvoiceTotal 和 Discount 列的最大值,但前提是客户出现在 InterestingCutomers 中并且 ID > 0:
CustID CustName MaxInvoiceTotal MaxDiscount
1 A 100 15
3 C 200 25
我的一个限制是我的应用程序是使用 Jet 4.0 和 ADO 的旧版 VB6。这不支持托管我的数据库的 SQL Server 2008 的许多高级功能。我可用的 SQL 函数列在此处:https://support.microsoft.com/en-us/kb/294698。
到目前为止,我已经能够获得最大的 InvoiceTotal,但我无法扩展相同的查询以达到 return 任何其他列的最大值。
以下正确 return 每个有效 CustID 的最大 InvoiceTotal:
SELECT Customers.CustID, CustName, InvoiceTotal, Discount
FROM ((Customers INNER JOIN Interesting ON Customers.CustID = Interesting.CustID) INNER JOIN Orders ON Customers.CustID = Orders.CustID)
WHERE ((CustID > 0)
AND (InvoiceTotal IN
(SELECT MAX(InvoiceTotal) AS MaxInvoiceTotal
FROM Orders
WHERE Orders.CustID = Customers.CustID)))
Returns:
CustID CustName MaxInvoiceTotal
1 A 100
3 C 200
但是,扩展 WHERE 子句以将 Discount 限制为每个客户的最大值仅 returns 记录,其中 InvoiceTotal 和 Discount 恰好是最大值并且属于同一订单:
WHERE ((CustID > 0) AND (InvoiceTotal IN
(SELECT MAX(InvoiceTotal) AS MaxInvoiceTotal
FROM Orders
WHERE Orders.CustID = Customers.CustID)) AND
Discount IN
(SELECT MAX(Discount) AS MaxDiscount
FROM Orders
WHERE Orders.CustID = Customers.CustID))
Returns:
CustID CustName MaxInvoiceTotal MaxDiscount
3 C 200 25
未选择 CustID 1,因为它的最大 InvoiceTotal 值与其最大折扣值属于不同的订单。我假设这两个条件都针对每个符合条件的订单进行了测试,但我想要一些方法来删除 OrderID 与 InvoiceTotal 和 Discount 之间的关联。 OR-ing 附加子句不起作用。
我怀疑我可能在 UNION
范围内,但想看看是否有更清洁或更有效的方法,考虑到我列出的限制。
SELECT Customers.CustID, CustName, MaxInvoiceTotal, MaxDiscount
FROM Customers
INNER JOIN Interesting ON Customers.CustID = Interesting.CustID
INNER JOIN (SELECT CustID, MAX(Discount) AS MaxDiscount
FROM Orders
Group by CustID) MaxDiscountOrders ON Customers.CustID =
MaxDiscountOrders.CustID
INNER JOIN (SELECT CustID, MAX(InvoiceTotal) AS MaxInvoiceTotal
FROM Orders
Group by CustID) MaxInvoiceTotalOrders ON Customers.CustID
= MaxInvoiceTotalOrders.CustID
WHERE CustID > 0
试试这个。不过我还没有检查语法错误。
SELECT CustID,
CustName = MAX(CustName),
InvoiceTotal = SUM(InvoiceTotal),
Discount = SUM(Discount)
FROM Orders O
INNER JOIN Customers C ON O.CustID = C.CustID
WHERE O.CustID IN (SELECT CustID
FROM InterestingCustomers)
AND O.CustID>0
GROUP BY CustID