Итого С комбинацией обязательных полей - PullRequest
0 голосов
/ 28 мая 2020

У меня есть таблица с svl2_name с комбинацией Grad, Country, Region с avg Count_emp в другом SVL2_Name и обновлением столбца Tot_Avg_Grad

create table GRADE_S1
(
  SVL2_NAME varchar2(29),
  GRADE    NUMBER,
  COUNTRY  VARCHAR2(20),
  REGION   varchar2(20),
  COUNT_EMP NUMBER,
  TOT_AVG_GRAD FLOAT
);

insert into GRADE_S1 values('TY',10,'CANADA','AMERICAS',3,null);
insert into GRADE_S1 values('TY',10,'CHINA','APJC',4,null);
insert into GRADE_S1 values('TY',9,'CHINA','APJC',6,null);
insert into GRADE_S1 values('TY',12,'FRANCE','EMEA',8,null);
insert into GRADE_S1 values('Anuj',10,'CANADA','AMERICAS',4,null);
insert into GRADE_S1 values('Anuj',10,'CHINA','APJC',6,null);
insert into GRADE_S1 values('Anuj',12,'FRANCE','EMEA',2,null);
insert into GRADE_S1 values('kumar',10,'CANADA','AMERICAS',4,null);
insert into GRADE_S1 values('kumar',10,'CHINA','APJC',4,null);
insert into GRADE_S1 values('kumar',9,'CHINA','APJC',6,null);
insert into GRADE_S1 values('kumar',12,'FRANCE','EMEA',6,null);

Нужна сводная таблица, как показано ниже.

Name Grad Country Region   Count_emp Tot_Avg_Emp
---- ---- ------- -------- --------- -----------
TY     10 CANADA  AMERICAS         3           4
TY     10 CHINA   APJC             4           5
TY      9 CHINA   APJC             6           3
TY     12 FRANCE  EMEA             8           4

Я подумываю создать такую ​​процедуру, как

Шаг 1:

--FOR Loop
select * from GRADE_S1 where SVL2_NAME='TY';

Шаг 2:

select AVG(COUNT_EMP)  INTO V_AVG_EMP
  from GRADE_S1
 where GRAD=INX.GRAD
   AND COUNTRY=INX.COUNTRY
   AND REGION = INX.REGION
   AND SVL2_NAME <> INX.SVL2_NAME

Шаг 3:

update GRADE_S1 set
  TOT_AVG_GRAD =V_AVG_EMP
  WHERE SVL2_NAME = INX.SVL2_NAME
    AND GRAD=INX.GRAD
    AND COUNTRY=INX.COUNTRY
    AND REGION = INX.REGION

или есть какой способ ...?

Спасибо

Ответы [ 3 ]

0 голосов
/ 28 мая 2020

SELECT
svl2_name,
оценка,
страна,
регион,
count_emp,
(
SELECT
AVG (count_emp)
FROM
grade_s1 g2
ГДЕ
g2.grade = g1.grade
И g2.country = g1.country
И g2.region = g1.region
И g2.svl2_name <> g1. svl2_name
) AS tot_avg_grad
FROM
grade_s1 g1

0 голосов
/ 28 мая 2020

Это похоже на оконную функцию:

select SVL2_NAME, GRADE, COUNTRY, REGION, count_emp,
       avg(count_emp) over (partition by country, region) as Tot_Avg_Emp
from grade_s1;

Если вы хотите отфильтровать конкретное имя, используйте подзапрос:

select g.*
from (select SVL2_NAME, GRADE, COUNTRY, REGION, count_emp,
             avg(count_emp) over (partition by country, region) as Tot_Avg_Emp
      from grade_s1
     ) g
where svl2_name = 'Ty';

На самом деле я не поощряю запись данных в таблицу. Но если вы действительно этого хотите, вы можете использовать update с коррелированным подзапросом:

update grade_s1 g
    set Tot_Avg_Emp = (select avg(count_emp)
                       from grade_s1 g2
                       where g2.country = t.country and t2.region = t.region
                      )
    where svl2_name = 'Ty';
0 голосов
/ 28 мая 2020

Используйте один оператор MERGE, коррелирующий с псевдостолбцом ROWID, и используйте функции analyti c для вычисления среднего по всем совпадающим строкам и, чтобы исключить текущую строку из среднего, просто найдите общее и вычесть текущее значение и счет и вычесть 1:

MERGE INTO Grade_s1 dst
USING(
  SELECT ROWID AS rid,
         CASE COUNT(*) OVER ( PARTITION BY grade, country, region )
         WHEN 1
         THEN NULL -- Avoid division by zero
         ELSE ( SUM(count_emp) OVER ( PARTITION BY grade, country, region ) - count_emp )
              / ( COUNT(*) OVER ( PARTITION BY grade, country, region ) - 1 )
         END AS tot_avg_grad
  FROM   grade_s1
) src
ON ( dst.ROWID = src.RID )
WHEN MATCHED THEN
  UPDATE
  SET tot_avg_grad = src.tot_avg_grad;

Затем:

SELECT *
FROM   grade_s1;

Вывод:

SVL2_NAME | GRADE | COUNTRY | REGION   | COUNT_EMP | TOT_AVG_GRAD
:-------- | ----: | :------ | :------- | --------: | -----------:
TY        |    10 | CANADA  | AMERICAS |         3 |            4
TY        |    10 | CHINA   | APJC     |         4 |            5
TY        |     9 | CHINA   | APJC     |         6 |            6
TY        |    12 | FRANCE  | EMEA     |         8 |            4
Anuj      |    10 | CANADA  | AMERICAS |         4 |          3.5
Anuj      |    10 | CHINA   | APJC     |         6 |            4
Anuj      |    12 | FRANCE  | EMEA     |         2 |            7
kumar     |    10 | CANADA  | AMERICAS |         4 |          3.5
kumar     |    10 | CHINA   | APJC     |         4 |            5
kumar     |     9 | CHINA   | APJC     |         6 |            6
kumar     |    12 | FRANCE  | EMEA     |         6 |            5

db <> fiddle здесь

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