2015-08-28 6 views
1

У меня довольно сложное время, чтобы выяснить, как это задавать. У меня есть 2 таблицы, один - список «Заказы» с временем реестра и другая таблица «Активность», где у меня есть регистр того времени, когда эти Заказы сделали это процессу.Выбор динамических столбцов Mysql

Что я не получу, как это сделать, следующее: мне нужно определить с запросом количество времени для каждого заказа со времени последнего процесса.

Таблица: Órdenes

| Id | Numero | flujo_id | LastOrder |   FechaRegistro | 
|----|--------|----------|-----------|--------------------------| 
| 1 | 111 |  1 |   0 | August, 13 2015 13:25:00 | 
| 2 | 222 |  1 |   2 | August, 13 2015 13:25:00 | 
| 3 | 333 |  1 |   4 | August, 13 2015 13:25:00 | 
| 4 | 444 |  1 |   3 | August, 13 2015 13:25:00 | 

Таблица: Actividad

| Id |    TiempoInicio | TiempoFin | Proceso_Id | Orden_Id | 
|----|--------------------------|-----------|------------|----------| 
| 7 | August, 13 2015 13:30:00 | (null) |   1 |  2 | 
| 8 | August, 13 2015 13:50:00 | (null) |   2 |  2 | 
| 9 | August, 13 2015 13:30:00 | (null) |   1 |  3 | 
| 10 | August, 13 2015 13:50:00 | (null) |   2 |  3 | 
| 11 | August, 13 2015 14:20:00 | (null) |   3 |  3 | 
| 12 | August, 13 2015 14:25:00 | (null) |   4 |  3 | 
| 13 | August, 13 2015 13:30:00 | (null) |   1 |  4 | 
| 14 | August, 13 2015 13:50:00 | (null) |   2 |  4 | 
| 15 | August, 13 2015 14:20:00 | (null) |   3 |  4 | 

Таблица: Procesos

| Id | Estacion_Id |            Nombre |     TiempoStd | 
|----|-------------|----------------------------------------------------|---------------------------| 
| 1 |   1 |  Informacion <br/>tecnica para <br/>aprobacion | January, 01 1970 00:02:00 | 
| 2 |   2 | Aprobacion de<br/> Informacion<br/>Tecnica cliente | January, 01 1970 00:24:00 | 
| 3 |   3 |    Informacion<br/>Tecnica de<br/>Proceso | January, 01 1970 00:04:00 | 
| 4 |   4 |   Compra y<br/>Recepcion de<br/>Materiales | January, 01 1970 02:00:00 | 

Ожидаемый результат.

| Id | Numero |   FechaRegistro | P1 | P2 | P3 | P4 | 
|----|--------|--------------------------|--------|--------|--------|--------| 
| 1 | 111 | August, 13 2015 13:25:00 | (null) | (null) | (null) | (null) | 
| 2 | 222 | August, 13 2015 13:25:00 | 5:00 | 20:00 | (null) | (null) | 
| 3 | 333 | August, 13 2015 13:25:00 | 5:00 | 20:00 | 30:00 | 5:00 | 
| 4 | 444 | August, 13 2015 13:25:00 | 5:00 | 20:00 | 30:00 | (null) | 

Что я не знаю, как сделать, это быть в состоянии сделать вызов динамически, так что я хотел бы получить P1, P2, P3, до Pn столбцов п = числа строк на столе «Procesos». И для расчета времени у меня есть идея, но поскольку я не знаю, как получить эти столбцы, я не могу попробовать.

Вот скрипка с загруженными таблицами. HERE

+0

скрипку не работает - или ссылка не все равно – RamRaider

+0

@RamRaider я просто попробовал это, и это делает, вы можете вновь попробовать ? –

+0

ОК, это был noscript, блокирующий ссылку - мои извинения ... вскрыты в хром! – RamRaider

ответ

2

Я придумал что-то вроде ниже. Это может показаться немного нечетким.

select ordenes.Id,Numero,FechaRegistro,m.p1,a.p2,b.p3,c.p4 from Ordenes 
left join (select ordenes.id, 
       TIMESTAMPDIFF(MINUTE,Ordenes.FechaRegistro,min(Actividad.TiempoInicio)) P1 
      from Ordenes 
      left join Actividad on ordenes.id=Actividad.orden_id 
      group by Actividad.orden_id) as m on ordenes.id=m.id 
left join (select Orden_Id,TIMESTAMPDIFF(MINUTE,min(TiempoInicio),max(TiempoInicio)) P2 
      from actividad 
      where Proceso_Id in ('1','2') 
      group by orden_id) as a on ordenes.id=a.orden_id 
left join 
(select Orden_Id,TIMESTAMPDIFF(MINUTE,min(TiempoInicio),max(TiempoInicio)) P3 
     from actividad 
     where Proceso_Id in ('2','3') 
     group by orden_id) as b on ordenes.id=b.orden_id 
left join 
(select Orden_Id,TIMESTAMPDIFF(MINUTE,min(TiempoInicio),max(TiempoInicio)) P4 
     from actividad 
     where Proceso_Id in ('3','4') 
     group by orden_id) as c on ordenes.id=c.orden_id 
order by id; 

Выход Я получаю

| Id | Numero |   FechaRegistro | P1 | P2 | P3 | P4 | 
|----|--------|--------------------------|--------|--------|--------|--------| 
| 1 | 111 | August, 13 2015 13:25:00 | (null) | (null) | (null) | (null) | 
| 2 | 222 | August, 13 2015 13:25:00 | 5  | 20  | 0  | (null) | 
| 3 | 333 | August, 13 2015 13:25:00 | 5  | 20  | 30  | 5  | 
| 4 | 444 | August, 13 2015 13:25:00 | 5  | 20  | 30  | 0  | 

Это не соответствует всем требованиям. Но это может быть полезно, по крайней мере, как ссылка, чтобы продолжить дальнейшее

DEMO Fiddle

+0

Thx для попытки, но im все еще с моей основной проблемой, которая является dtnamic частью, если сохранить разницу уже было бы легче получить это динамически? Итак, сохранив 5 минут, 20 и т. Д.? –

+0

Человек, я пытаюсь понять, как ваш запрос работает, и я действительно не понимаю, почему бы мне получить 0 вместо нуля в id 2 и 4, вы знаете, как объяснить это мне? –

+0

Sry, я был занят. Это '0', потому что в этом случае оба' Min' и 'max' будут той же даты. Итак, 'select TIMESTAMPDIFF (MINUTE, '2015-08-13 13:30:00', '2015-08-13 13:30:00'),' даст '0'. – Crazy2crack

Смежные вопросы