2016-01-20 2 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-04-01, отчет будет:

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