2015-06-17 4 views
1

У меня есть следующие таблицы в 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, но хотел проверить, есть ли более чистый или более эффективный способ сделать это, учитывая ограничения, которые я изложил.

ответ

1
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 

Попробуйте это. Я еще не проверил синтаксическую ошибку.

+0

Точно, что я искал - спасибо! – pdm2011

+0

В конце я использовал левые соединения в подзапросах Заказов, так как мы решили включить интересных клиентов, даже если они никогда не размещали заказ. – pdm2011

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 
Смежные вопросы