Как создать уникальную запись для каждого года, но затем создать отдельные записи для каждого значения (НЕ ДУБЛИРОВАТЬ) - PullRequest
0 голосов
/ 25 сентября 2018

Поэтому в настоящее время я пытаюсь вставить агрегированные (суммированные) данные в таблицу с именем Значение .Я пытаюсь создать запись в таблице Расчет для каждого уникального года, который я могу извлечь из своего курсора.Затем я пытаюсь вставить эти отношения в таблицу Value_Calculation_Rel .Если уровень_группы равен '6', я буду вставлять 'YEAR_PEAK_COLOR' в столбец computing_name .Если значение для group_level равно '4', я буду вставлять 'YEAR_PEAK_SHAPE' в столбец computing_name .Поэтому, по сути, мне нужна отдельная запись в таблице Calculation для каждого года.Затем в таблице VALUE я хочу отдельную запись для каждого вычисляемого мной значения (будь то сумма для цвета, фигуры или максимум для цвета, фигуры, сгруппированных по YEAR ).Затем я хочу получить записи в таблице Value_Calculation_Rel , показывающие взаимосвязь между записями в Расчет и Значение (по годам).

Конечный результатчто я хочу, выглядит так:

ТАБЛИЦА РАСЧЕТОВ

 CALCULATION_ID    CALCULATION_DATE     CALCULATION_NAME    REPORT_PERIOD
      1               sysdate          'YEAR PEAK COLOR'         1-1-2017
      2               sysdate          'YEAR PEAK SHAPE'         1-1-2017
      3               sysdate          'YEAR PEAK COLOR'         1-1-2018
      4               sysdate          'YEAR PEAK COLOR'         1-1-2019
      5               sysdate          'YEAR PEAK SHAPE'         1-1-2019

СТОИМОСТЬ ЗНАЧЕНИЯ

  VALUE_ID         VALUE             YR
     1              55               1-1-2017
     2              10               1-1-2017
     3              18               1-1-2018
     4              22               1-1-2019
     5              77               1-1-2018
     6              101              1-1-2019
     7              33               1-1-2019

CALCULATON_VALUE REL TABLE

 CALCULATION_VALUE_ID    CALCULATION_ID   VALUE_ID    SHAPE      COLOR
      1                      1              1          null       RED
      2                      2              2         CIRCLE      null
      3                      3              3          null       BLUE 
      4                      4              4          null       BLUE
      5                      3              5         SQUARE      null
      6                      4              6          null       RED
      7                      5              7         SQUARE      null

Ниже приведен мой код (который в настоящее время создает новую запись расчета для каждого значения, что неверно):

create or replace procedure STORED_PROC
IS
CURSOR c1 is
select
  trunc(hr, 'yyyy') yr,
  shape,
  sum(value) total,
  max(value) maxval,
  color,
  grouping_id(trunc(hr, 'yyyy'), shape, color) AS group_level_nb
from value v
join calculation_value cv on v.value_id = cv.value_id
group by cube (trunc(hr, 'yyyy'), shape, color);
  l_var c1%ROWTYPE;
  v_value_id value.value_id%type;
  v_calculation_id calculation.calculation_id%type;     
--
BEGIN                                          
IF l_var.group_level_nb = '6'
THEN
    INSERT INTO CALCULATION(calculation_id, calculation_date, calculation_name, report_period_dt)
                        VALUES (null, sysdate, 'YEAR_PEAK_COLOR' || to_char(sysdate, 'hh24:mi:ss'), l_var.yr)
 returning calculation_id into v_calculation_id;
    INSERT INTO value(value_id, value, yr)
               VALUES (null, l_var.total, l_var.yr)
               returning value_id into v_value_id;
    INSERT INTO calculation_value (calculation_value_id, calculation_id, value_id, color)
                             VALUES (null, v_calculation_id, v_value_id, l_var.color);
commit;
--
ELSIF l_var.group_level_nb = '4'
THEN
    INSERT INTO CALCULATION(calculation_id, calculation_date, calculation_name, report_period_dt)
                        VALUES (null, sysdate, 'YEAR_PEAK_SHAPE '  || to_char(sysdate, 'hh24:mi:ss'), l_var.yr )
                        returning calculation_id into v_calculation_id;
--
     INSERT INTO value (value_id, value, yr)
                    VALUES (null, l_var.maxval, l_var.yr)                        returning value_id into v_value_id;
    INSERT INTO calculation_value (calculation_value_id, calculation_id, value_id, shape) 
VALUES (null, v_calculation_id, v_value_id, l_var.shape);        
END IF;
--
commit;
--
END STORED_PROC;

Пожалуйста, дайте мне знатьесли есть какая-либо дополнительная информация, которую я мог бы опустить, которую мне необходимо добавить.Заранее спасибо.

1 Ответ

0 голосов
/ 26 сентября 2018

Вот решение, которое сначала проверяет, присутствует ли запись в CALCULATION TABLE, и добавляет строку, только если ее нет.В обоих случаях у вас будет v_calculation_id, доступный для ваших следующих шагов.Я не выписывал его с помощью курсора и всего остального, но вам должно быть легко заменить ваш INSERT INTO CALCULATION на мой select CALCULATION_ID [...] returning t.CALCULATION_ID into v_calculation_id.HTH

create sequence seq;
create table tab (
    CALCULATION_ID number default on null seq.nextval not null enable,
    CALCULATION_DATE date,
    CALCULATION_NAME varchar2(100),
    REPORT_PERIOD varchar2(100));

declare
    v_calculation_id   number;
    v_CALCULATION_NAME varchar2(100) := 'name';
    v_REPORT_PERIOD    varchar2(100) := 'period';
begin
    begin
        select CALCULATION_ID into v_calculation_id 
        from tab where CALCULATION_NAME = v_CALCULATION_NAME and REPORT_PERIOD = v_REPORT_PERIOD;
        EXCEPTION WHEN NO_DATA_FOUND THEN
            insert into tab t
            (CALCULATION_ID, CALCULATION_DATE, CALCULATION_NAME , REPORT_PERIOD)
            values (null, sysdate, v_CALCULATION_NAME , v_REPORT_PERIOD)
            returning t.CALCULATION_ID into v_calculation_id;
    end;
dbms_output.put_line(v_calculation_id);
end;
/

select * from tab;

Редактировать из-за комментария:

вы не предоставили полную процедуру, и некоторые вещи не суммируются - например, один раз столбец в таблице CALCULATION называется REPORT_PERIOD, а в другой раз - called report_period_dt.другой пример: в примерах данных значение CALCULATION_NAME, например, 'YEAR PEAK COLOR', но в процедуре вы заполняете его так: 'YEAR_PEAK_COLOR' || to_char(sysdate, 'hh24:mi:ss') - так выше, я решил дать вам технический пример вместо того, чтобы изменить вашу процедуру,но с учетом упомянутых выше неопределенностей я имел в виду, что вы заменяете вот так (и аналогично для l_var.group_level_nb = '4'):

[...]
IF l_var.group_level_nb = '6'
THEN
    INSERT INTO CALCULATION(calculation_id, calculation_date, calculation_name, report_period_dt)
                        VALUES (null, sysdate, 'YEAR_PEAK_COLOR' || to_char(sysdate, 'hh24:mi:ss'), l_var.yr)
 returning calculation_id into v_calculation_id;
    INSERT INTO value(value_id, value, yr)
[...]

становится

[...]
IF l_var.group_level_nb = '6'
THEN
     begin
        select CALCULATION_ID into v_calculation_id 
        from CALCULATION where CALCULATION_NAME = 'YEAR_PEAK_COLOR' and REPORT_PERIOD = l_var.yr;
        EXCEPTION WHEN NO_DATA_FOUND THEN
            insert into CALCULATION t
            (CALCULATION_ID, CALCULATION_DATE, CALCULATION_NAME , report_period_dt)
            values (null, sysdate, 'YEAR_PEAK_COLOR' , l_var.yr)
            returning t.CALCULATION_ID into v_calculation_id;
    end;
    INSERT INTO value(value_id, value, yr)
[...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...