如何为每年创建唯一的记录,然后为每个值创建不同的记录(不重复)

时间:2018-09-25 20:35:23

标签: oracle plsql

因此,当前我正在尝试将汇总(汇总)数据插入名为 Value 的表中。我试图在计算表中为我能够从其光标得出的每个唯一年份创建一条记录。然后,我尝试将这些关系插入 Value_Calculation_Rel 表中。如果group_level为'6',我将在 calculation_name 列中插入'YEAR_PEAK_COLOR'。如果group_level的值为“ 4”,我将在“ calculation_name ”列中插入“ YEAR_PEAK_SHAPE”。 因此,从本质上讲,我希望每年在 Calculation (计算)表中获得一条记录。然后,在 VALUE 表中,我希望为我计算出的每个值提供一个不同的记录(无论是颜色,形状的总和还是颜色的最大值,形状都是按 YEAR 分组的)。然后,我想要 Value_Calculation_Rel 表中的记录,以显示 Calculation 中的记录与 Value 中的记录之间的关系(按年份)。

我想要的最终结果如下:

计算表

 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 TABLE

  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关联表

 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 :(得分:1)

这里是一个解决方案,它首先检查记录在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)
[...]