2017-02-10 68 views
0

我有兩個表。一個是基本的客戶信息,一個是訂購信息。選擇與關聯值MAX(日期)

我正在嘗試查找訂單狀態爲'已放置'或'已取消'的最大(訂單日期)。我不在乎是否放置或取消狀態。我只想要最近的訂單。

第一個表(信息)

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