Как написать oracle один запрос, чтобы получить данные из 2 таблиц - PullRequest
1 голос
/ 09 февраля 2020

В моей системе две таблицы, как показано ниже

input table

Мне нужно написать один запрос в oracle, который даст мне результат ниже

result

Я понимаю, как написать их в другом запросе, но в одном запросе я понятия не имею ..

вот результат это группировка по ремеслу и плановая стоимость = сумма (час * ставка) аналогично фактической стоимости

Ответы [ 3 ]

1 голос
/ 09 февраля 2020

Один из подходов состоит в агрегировании до объединения :

select p.craft, p.planned, a.actual
from (select craft, sum(hrs * rate) as planned
      from wplabor
      group by craft
     ) p join
     (select craft, sum(hrs * rate) as actual
      from labtrans
      group by craft
     ) a 
     on p.craft = a.craft;

В вашем примере все ремесла находятся в обеих таблицах. Если некоторые из них отсутствуют в одной из таблиц, вам понадобится внешнее объединение.

1 голос
/ 10 февраля 2020

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

with
WPLABOR (WONUM, CRAFT,  HRS, RATE) as (
    select 50028507, 'AIRSYS', 0.5, 30  from dual union all
    select 50028537, 'AIRSYS', 2, 30 from dual union all
    select 50031118, 'AIRSYS', 8, 10 from dual union all
    select 50031118, 'ELEC', 8, 30 from dual union all
    select 50034485, 'ELEC', 0.5, 18 from dual  
) ,
LABTRANS  (WONUM, CRAFT,  HRS, RATE) as (
    select 50028507, 'AIRSYS', 0.5, 30  from dual union all
    select 50028537, 'AIRSYS', 1, 36 from dual union all
    select 50031118, 'AIRSYS', 6, 30 from dual union all
    select 50031118, 'ELEC', 8, 30 from dual  union all
    select 50034485, 'ELEC', 1, 17 from dual  
) 
SELECT WPLABOR.CRAFT||LABTRANS.CRAFT CRAFT,   
SUM(WPLABOR.HRS*WPLABOR.RATE)  Total_Planned_cost  , 
SUM(LABTRANS.HRS*LABTRANS.RATE) Total_actual_cost  FROM WPLABOR 
 full join
     LABTRANS
     on 1 = 0
GROUP BY WPLABOR.CRAFT||LABTRANS.CRAFT

enter image description here

db <> fiddle db fiddle link

Поэтому при условии, что ваши имена таблиц равны WPLABOR и LABTRANS соответственно. и имена столбцов, как я использовал / предположил. тогда запрос может сделать работу. вам нужна только эта часть запроса.

SELECT WPLABOR.CRAFT||LABTRANS.CRAFT CRAFT,   
SUM(WPLABOR.HRS*WPLABOR.RATE)  Total_Planned_cost  , 
SUM(LABTRANS.HRS*LABTRANS.RATE) Total_actual_cost  FROM WPLABOR 
 full join
     LABTRANS
     on 1 = 0
GROUP BY WPLABOR.CRAFT||LABTRANS.CRAFT 
1 голос
/ 09 февраля 2020

Для этого примера данных вы можете присоединиться к таблицам и агрегировать:

select w.craft,
  sum(w.planned * w.rate) "Total Planned (cost)",
  sum(l.actual * l.rate) "Total Actual (cost)"
from wplabor w inner join labtrans l
on l.wonum = w.wonum
group by w.craft

Возможно, условие условия ON также должно включать равенство столбцов craft:

on l.wonum = w.wonum and l.craft = w.craft

, но для данных этого примера это не требуется.

...