2016-01-20 54 views
2

我有一個ORDER_STATUS表所示:如何編寫查詢來根據條件檢查另一個表?

order_id order_status 
1   100 
2   1000 
3   1000 

我有存儲歷史數據,以便另一個表order_status_history:

id order_id order_status status_date 
1 1   100   2016-01-01 
2 2   100   2016-02-01 
3 2   300   2016-04-01 
4 3   100   2016-04-01 
5 3   400   2016-04-01 
6 3   1000   2016-04-01 
7 2   1000   2016-05-01 

我想建立一個每日報告,對於給定的日期,我想看看訂單是否已完成或正在進行。我對SQL很不好,不知道如何去做。如果某個日期的訂單狀態爲< 1000,則表示正在進行,否則結束。

例如:對於日期2016年4月1日,該報告將是:

order_id status 
1   in-progress (because as of report date, its latest status is 100) 
2   in-progress (because as of report date, its latest status is 300) 
3   completed (because as of report date, its latest status is 1000) 

我試圖像下面的嘗試正在進行的訂單至少找到的東西:

select distinct s.order_id, s.order_status 
from order_status 
    left join order_status_history h on h.order_id = s.order_id 
where max(h.status_date) <'2016-04-01' 
    and status < 1000 

任何非常感謝幫助!

+0

order_status表中的當前狀態是否也在歷史表上? – Shadow

+0

'order_status'表格並沒有什麼意義。 –

回答

1

我不知道你的狀態是什麼意思。但是對於一個給定的順序,它們似乎總是在增加。因此,最近的一次將具有最大的價值:

select osh.order_id, max(osh.order_status) 
from order_status_history osh 
group by osh.order_id; 

如果增加狀態的假設是不正確的,那麼你可以使用一個聚集和聯接:

select osh.* 
from order_status_history osh join 
    (select order_id, max(status_date) as maxsd 
     from order_status_history 
     group by order_id 
    ) o 
    on osh.order_id = osh.order_id; 

至於文字說明,你真的應該存儲在參考表信息和連接它的(我懷疑是什麼order_status是,但只是描述甚少。)否則,您使用case聲明:

select (case when osh.order_status = 100 then 'in-progress' 
      when osh.order_status = 100 then 'in-progress' 
      when osh.order_status = 1000 then 'completed' 
     end) 
+0

謝謝!你能否幫我弄清楚如何爲訂單選擇max(status_date)的相應狀態? –

+0

@UndefinedVariable。 。 。我相信這些查詢就是這樣做的。 –

0

如果你想獲得的order_id狀態爲指定的日期,你可以使用一個查詢

SELECT OS.order_id, 
     CASE WHEN 
      (SELECT MAX(OSH.order_status) 
      FROM order_status_history AS OSH 
      WHERE OSH.order_id = OS.order_id 
         AND OSH.status_date <= @date)) < 1000 
      THEN 'in-progress' 
      ELSE 'completed' END status 
FROM order_status AS OS 
0

試試這個

select m.order_id,IF(order_done < order_status,'in-progress (because as of report date, its latest status is '||m.order_done,'completed (because as of report date, its latest status is '||m.order_done) status 
    from order_status m left join (select osh.order_id, max(osh.order_status) order_done 
    from order_status_history osh 
where osh.status_date <'2016-04-01' and osh.status < 1000 
    group by osh.order_id) n on m.order_id = n.order_id 
0

假設,即使是目前的訂單狀況被記錄在歷史記錄表(基於這對於訂單1的數據):

select distinct s.order_id, s.order_status as current_order_status, if(h2.order_status<1000,'in progress','completed') as status_at_report_date 
from order_status left join 
    (select order_id, max(id) as max_id from order_status_history h1 
    where h1.status_date<='2016-04-01') t on t.order_id=s.order_id 
    left join order_status_history h2 on t.max_id=h2.id 
相關問題