2017-02-10 7 views
0

У меня есть две таблицы. Одна из них - основная информация о клиенте, а другая - информация для заказа.выберите MAX (date) с ассоциированным значением

Я пытаюсь найти максимальную (дату заказа) с статусом заказа 'placement'or'cancelled'. Меня не волнует, если статус был помещен или отменен. Мне просто нужен самый последний заказ.

Первая таблица (Info)

CustomerID  LAST NAME FIRST NAME 
     1    AB   BOB 
     2    BC   ROBERT 
     3    AA   JOHN 

Вторая таблица (заказ)

CustomerID  Order Date Order Status 
1    12/16/2016 placed 
2    8/5/2016  cancelled 
1    5/8/2015  cancelled 
2    8/9/2016  placed 
3    7/15/2016 cancelled 
3    8/20/2015 placed 

Я хочу, чтобы результат:

CustomerID FirstName LastName OrderDate OrderStatus 
1    AB  BOB  12/16/2016 placed 
2    BA  ROBERT  8/9/2016  placed 
3    AA  JOHN  7/15/2016  cancelled 

Вот мой SQL синтаксис

SELECT distinct Info.CustomerID, Info.Lastname,Info.Firstname 
    FROM INFO 
    INNER JOIN 
    (SELECT 
    order.CustomerID, LastOrderDate=max(OrderDate),order.OrderStatus 
    FROM Order 
    GROUP BY order.CustomerID, order.orderstatus)a 
    ON a.CustomerID=Info.CustomerID 

Это не сработало, потому что оно группируется по статусу заказа, который дает мне максимальную дату каждого из всех orderstatus. Затем я попробовал

SELECT distinct Info.CustomerID, Info.Lastname,Info.Firstname, Order.OrderStatus 
    FROM INFO, Order 
    INNER JOIN 
    (SELECT 
    order.CustomerID, LastOrderDate=max(OrderDate) 
    FROM Order 
    GROUP BY order.CustomerID)a 
    ON a.CustomerID=Info.CustomerID 

Это не сработало ни потому, что говорит, что Info.CustomerID не может быть привязан.

Любые помощь? Благодаря!

+0

Вы хотите только дату или соответствующую строку заказа? –

+0

Соответствующий ряд заказов. Статус даты и заказа – CHYP123

+0

Что делать, если заказ был размещен и отменен в тот же день? Какую строку вы хотите? –

ответ

0

Вы можете попробовать следующий запрос:

SELECT c.customerid, c.last_name, c.first_name, o.order_status, MAX(order_date) 
FROM customer c JOIN order ON c.customerid = o.customerid 
WHERE o.order_status IN ('placed', 'cancelled') 
GROUP BY c.customerid, c.last_name, c.first_name, o.order_status; 

обновление

Если вы не хотите max даты по статусу заказа, то вы можете удалить его из group by, например:

SELECT c.customerid, c.last_name, c.first_name, MAX(order_date) 
FROM customer c JOIN order ON c.customerid = o.customerid 
WHERE o.order_status IN ('placed', 'cancelled') 
GROUP BY c.customerid, c.last_name, c.first_name; 

Другая информация

После запрос возвратит обе записи, если заказ размещен и получает отменен в тот же день:

SELECT c.customerid, c.first_name, c.last_name, o.order_date, o.order_status 
FROM customer c JOIN 
(SELECT o1.customerid, o1.order_date, o1.order_status 
FROM `order` o1 JOIN 
(SELECT o.customerid, max(o.order_date) as max_date 
FROM `order` o 
WHERE o.order_status in ('placed', 'cancelled') 
GROUP BY o.customerid) o2 
ON o1.customerid = o2.customerid and o1.order_date = o2.max_date) o 
ON c.customerid = o.customerid; 

Вот SQL Fiddle.

+0

'WHERE o.order_status IN (..)' преобразует ваш LEFT JOIN в INNER JOIN. –

+0

Ах да! спасибо, что указали это. Я обновил ответ :) –

+0

Он по-прежнему возвращает дату для каждого статуса заказа у одного и того же клиента :( – CHYP123