2014-12-18 2 views
0

Мне нужно рассчитать общую стоимость для job_id, включая заработную плату и стоимость оборудования. Мне только удается рассчитать один раз. Мне нужно суммировать как заработную плату, так и стоимость фурнитуры job_id.Рассчитать сумму из двух запросов?

staff_on_job Таблица (ФК: staff_id, job_id)

Staff_on_job table

фитинги Таблица

Fittings

job_fittings Таблица (ФК: job_id, fitting_name)

job_fittings

Расчет заработной платы на одного job_id

select job_id ,sum(hours*30)from staffs_on_job group by job_id; 

Выходной

wages

рассчитать общую стоимость на фитинг за job_id

select jf.job_id ,sum(f.cost) 
from jobs_fittings jf left OUTER JOIN fittings f 
on(jf.FITTING_NAME = f.FITTING_NAME) 
group by jf.JOB_ID; 

Выход

enter image description here

Каков запрос для расчета общей стоимости job_id как с оплатой труда, так и с учетом стоимости? Можно ли объединить сумму из обоих запросов?

+0

Что вы используете? Microsoft SQL, MySQL, Oracle и т. Д.? –

+0

oracle sql develpoer – mhrzn

ответ

1

Лучший способ состоит в том, чтобы разбить запрос на два простых запроса, а затем объединить их. Это решение предполагает, что у работы всегда будет кто-то, кто ее работает, но может не иметь каких-либо подходящих затрат (следовательно, левое соединение от заработной платы до фитингов). На самом деле это недостаток в дизайне схемы, так как должен быть рабочий стол (возможно, есть тот, который вы не включили в свой пример), который вы оставили бы как заработную плату, так и фитинги.

WITH job_wage_costs AS 
(
    SELECT job_id, 
      SUM(hours) * 30 AS wage_costs 
    FROM  staff_on_job 
    GROUP BY job_id 
), 
job_fitting_costs AS (
    SELECT job_id, 
      SUM(COST) AS fitting_costs 
    FROM  job_fittings jf 
    JOIN  fittings f ON (f.fitting_name = jf.fitting_name) 
    GROUP BY job_id 
) 
SELECT jw.job_id, 
     jw.wage_costs, 
     jf.fitting_costs 
FROM  job_wage_costs jw 
LEFT OUTER JOIN job_fitting_costs jf ON (jf.job_id = jw.job_id); 

JOB_ID WAGE_COSTS FITTING_COSTS 
1  60   20 
2  480   164.99 
6  1200  199.99 
12  1200  320.98 
9  90 

Как и в сторону, дизайн вашего стола фитинги могли бы сделать с изменением, как это не normalized design. Воспроизводя тип фитинга в каждой строке, вы очень затрудните изменить формулировку этих типов подгонки в будущем, так как вам нужно будет изменить каждую строку - они должны быть в таблице fit_type, которая затем может быть присоединена к фитингам.

+0

есть и другие таблицы. Fitting_type - это внешний ключ, вы можете написать для него один запрос соединения.Мне нужно fitcost + заработная плата job_id – mhrzn

+0

Это единственный запрос, он просто использует оператор WITH, чтобы разбить вычисления на подзапросы. Чтобы получить общую стоимость, просто добавьте 'NVL (jw.wage_costs, 0) + NVL (jf.fitting_costs, 0) AS total_cost' в окончательный оператор SELECT. – XVar

+0

Стол называется staffs_on_job или staff_on_job - вы ссылаетесь на него как на свой вопрос, возможно, в этом и проблема. Запрос, который я предоставил, отлично работает локально с моими собственными копиями таблиц в вашем примере. – XVar

0

самым простым решением является присоединиться к 2 запроса:

select A.job_id, A.wages,B.fittingcost, total = A.wages + B.fittingcost 
from (
     select job_id ,sum(hours*30) wages from staffs_on_job group by job_id 
    ) A 
    join (
     select jf.job_id ,sum(f.cost) fittingcost 
     from jobs_fittings jf left OUTER JOIN fittings f 
     on(jf.FITTING_NAME = f.FITTING_NAME) 
     group by jf.JOB_ID 
    ) B on (A.job_id = B.job_id) 

быть в курсе, что выше, не будет правильно обрабатывать случай, когда один из 2-х таблиц не содержат job_id вы ищете; если одна из таблиц не содержит этого job_id, тогда результат будет полностью пустым.

+0

говорит из ключевого слова missing double checked it! – mhrzn

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