У меня есть следующие таблицы в SQL Server 2008 базы данных R2:SQL-запрос для возврата максимальных значений из нескольких столбцов
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
Я хочу, чтобы запрос, который показывает максимальное значение для обеих колонок InvoiceTotal и Скидка для каждого CustID и CustName по всем заказам, но только тогда, когда клиент появляется в InterestingCutomers и имеет идентификатор> 0:
CustID CustName MaxInvoiceTotal MaxDiscount
1 A 100 15
3 C 200 25
Один restrition у меня есть, что мое приложение наследие VB6 с помощью Jet 4.0 и ADO. Это не поддерживает многие расширенные функции SQL Server 2008, где размещается моя база данных. Доступные здесь функции SQL перечислены здесь: https://support.microsoft.com/en-us/kb/294698.
До сих пор мне удалось получить максимальный InvoiceTotal, но я не могу продлить тот же запрос для работы, чтобы вернуть максимум любого другого столбца.
Следующие правильно возвращает максимальное InvoiceTotal для каждого действительного CustID:
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)))
возвраты:
CustID CustName MaxInvoiceTotal
1 A 100
3 C 200
Однако расширение ИНЕКЯ ограничить Скидку до максимального значения для каждого клиента только возвращает записи, где как 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))
Возвращает:
CustID CustName MaxInvoiceTotal MaxDiscount
3 C 200 25
CustID 1 не выбран, поскольку его максимальная InvoiceTotal значение принадлежит различного порядка от его максимального значения со скидкой. Я предполагаю, что оба условия протестированы против каждого заказа, который квалифицировался для достижения этой цели, но я хотел бы как-то удалить связь между OrderID и InvoiceTotal и Discount. ИЛИ - добавление дополнительного предложения не работает.
Я подозреваю, что я могу находиться на территории UNION
, но хотел проверить, есть ли более чистый или более эффективный способ сделать это, учитывая ограничения, которые я изложил.
Точно, что я искал - спасибо! – pdm2011
В конце я использовал левые соединения в подзапросах Заказов, так как мы решили включить интересных клиентов, даже если они никогда не размещали заказ. – pdm2011