2016-01-20 55 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 
相关问题