SQLite - выполнение расчета в предыдущих строках - PullRequest
0 голосов
/ 12 ноября 2018

Проблема заключается в следующем.Если у меня есть количество в любом месте, я хочу выполнить расчет ниже для каждого члена этого job_no.

Идея состоит в том, что если в loc3 есть количество, то такое же количество ранее было в loc1 и loc2.

Итак, как мне получить 10 в loc1, и loc2 может быть другим способом выразить это ..?

select s.job_no, s.part, s.location, s.qty, 
    coalesce(ptime.setup_time, '-') as setup_time, 
    coalesce(ptime.cycle_time, '-') as cycle_time,
    ci.rate
    from stock as s join part_timings as pt
    on pt.part = s.part
    join locations as l on s.location = l.location
    left join part_timings as ptime on s.part = ptime.part
    and ptime.location = s.location
    join costs_internal as ci
    group by s.part, s.location
    order by s.part, l.stage



job_no | part | location | qty | setup_time | cycle_time | rate | total
123      p1     loc1       0     60           30           0.5    ?
123      p1     loc2       0     30           15           0.5    ?
123      p1     loc3       10    60           15           0.5    ?
123      p1     loc4       0     60           15           0.5    ?
123      p1     loc5       0     60           15           0.5    ?
123      p1     loc6       0     60           15           0.5    ?
123      p1     loc7       20    60           15           0.5    ?

вычисление для получения итогов:

coalesce(round((pt.cycle_time * s.qty * ci.rate) + 
(pt.setup_time * ci.rate), 2), '-')

РЕДАКТИРОВАТЬ:

Я добавил loc4 к loc7.

loc3 потребуется применить вычисления к loc1 и loc2 (кол-во 10).

loc7 потребуетсявычисление применялось ко всем расположенным перед ним местоположениям (кол-во 20).

Может быть, я не совсем это объясняю, изо всех сил пытаюсь донести свои намерения иногда с помощью SQL!

1 Ответ

0 голосов
/ 12 ноября 2018

Использование упрощенной версии ваших данных ...

select * from stock;

job_no      qty         location  
----------  ----------  ----------
123         0           loc1      
123         0           loc2      
123         10          loc3      
123         0           loc4      
456         0           loc1      
456         20          loc2      

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

select stock.*, stocked.qty
from stock
join (select * from stock s where s.qty != 0) as stocked 
  on stock.job_no = stocked.job_no;

job_no      qty         location    qty       
----------  ----------  ----------  ----------
123         0           loc1        10        
123         0           loc2        10        
123         0           loc4        10        
123         10          loc3        10        
456         0           loc1        20        
456         20          loc2        20        

stocked содержит строку для каждой работы, которая в данный момент хранится в хранилище.

Обратите внимание, что, если вы не установили ограничение, для работы может быть несколько строк для заготовки.


loc7 необходимо будет применить расчет ко всем расположенным перед ним местоположениям (кол-во 20).

С этими данными...

sqlite> select * from stock order by job_no, location;
job_no      qty         location  
----------  ----------  ----------
123         0           loc1      
123         0           loc2      
123         10          loc3      
123         0           loc4      
123         0           loc5      
123         0           loc6      
123         20          loc7      
456         0           loc1      
456         20          loc2      

Чтобы выполнить это, вместо присоединения к подвыборке, сделайте это для каждого столбца, в противном случае мы получим несколько значений на складе.(Возможно, есть способ сделать это с помощью объединения)

Чтобы убедиться, что мы выбираем только предыдущие местоположения (или наши собственные), необходимо проверить, что stock.location <= stocked.location.Чтобы гарантировать, что мы получим самый близкий, упорядочите их по местоположению и выберите только первый.

select stock.*, (
    select stocked.qty
    from stock stocked
    where stock.job_no = stocked.job_no
      and qty != 0
      and stock.location <= stocked.location
    order by stocked.location asc
    limit 1
) as stocked_qty
from stock
order by job_no, location;

job_no      qty         location    stocked_qty
----------  ----------  ----------  -----------
123         0           loc1        10         
123         0           loc2        10         
123         10          loc3        10         
123         0           loc4        20         
123         0           loc5        20         
123         0           loc6        20         
123         20          loc7        20         
456         0           loc1        20         
456         20          loc2        20    

Это может быть неэффективно в качестве подвыбора столбца.Важно, чтобы все job_no, qty и location были проиндексированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...