вычитая из среднего Oracle SQL - PullRequest
0 голосов
/ 25 мая 2019

Я хотел бы рассчитать среднее значение столбца из одной таблицы, а затем вычесть фактическое значение из этого среднего значения в другой таблице.

Процесс сравнивает фактическую цену за вычетом средней цены.

Я получаю сообщение об ошибке: «однострочный подзапрос возвращает более одной строки»

мой запрос:

select proc_std_cost,adprc_pat_cost, 
(select round(avg(adprc_pat_cost),2) from adm_prc group by proc_code) as avgerage,
proc_std_cost-(select round(avg(adprc_pat_cost),0) from adm_prc group by proc_code) as difference
from procedure p join adm_prc a on (a.proc_code=p.proc_code);

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

enter image description here

образец таблиц:

adm_prc

enter image description here

процедура

enter image description here

спасибо

1 Ответ

0 голосов
/ 25 мая 2019

Я думаю, что аналитическая форма функции AVG может помочь. Вот пример; Мне не хотелось вводить столько значений (так как вы не предоставили образцы данных CREATE TABLE и INSERT INTO), но я надеюсь, что вы поймете, что это такое. Обратите внимание на строки №20 и №21.

SQL> with adm_prc (proc_code, adprc_pat_cost) as
  2    (select 12055, 250    from dual union all
  3     select 43111, 355    from dual union all
  4     select 15510, 75     from dual union all
  5     select 19887, 68     from dual union all
  6     select 29844, 109.28 from dual union all
  7     select 33335, 70.45  from dual
  8    ),
  9  procedure (proc_code, proc_std_cost) as
 10    (select 12055, 250    from dual union all
 11     select 15509, 75     from dual union all
 12     select 15510, 75     from dual union all
 13     select 15511, 200    from dual union all
 14     select 17122, 500    from dual
 15    )
 16  select
 17    a.proc_code,
 18    a.adprc_pat_cost,
 19    p.proc_std_cost,
 20    round(avg(a.adprc_pat_cost) over (order by null), 2) avg_adm_cost,
 21    p.proc_std_cost - round(avg(a.adprc_pat_cost) over (order by null), 2) diff
 22  from adm_prc a left join procedure p on p.proc_code = a.proc_code;

 PROC_CODE ADPRC_PAT_COST PROC_STD_COST AVG_ADM_COST       DIFF
---------- -------------- ------------- ------------ ----------
     12055            250           250       154,62      95,38
     15510             75            75       154,62     -79,62
     29844         109,28                     154,62
     43111            355                     154,62
     19887             68                     154,62
     33335          70,45                     154,62

6 rows selected.

SQL>
...