根据当月的数据生成直到年底的行

时间:2019-08-21 08:29:58

标签: sql oracle plsql

我从一年的第一天到当前月份都有数据。我必须先获取当前月份的数据,然后通过更改标志直到年底才填充相同的数据

我打算创建一个并集查询,但无法根据当月动态更改它。

我有一个表,该表有8列,而'Flag'是第9列,其中一列是具有月年数据的日​​期。我要问的是,我必须选择当前月份的数据,并用即将到来的月份名称的月份年份填充相同的数据,直到剩下的7列的年末标记为“未来”。最好的方法是什么?例如,我有从19年1月到19年8月的数据。我必须复制8月19日的数据,并将日期(Month_Year)字段更改为“ 9月19日至12月19日”,并将其与原始表合并,因为它具有截至19年8月19日的全年数据和实际数据,并复制了8月的数据。 19日至12月19日

1 个答案:

答案 0 :(得分:0)

请添加表结构/数据集。您还可以将表格的摘要/图片与数据一起附加。Below is a sample structure based on what you mentioned

1。请记住,八月当前只有21天数据,因此您可以在剩余天数中重复最后几天的数据。 2.您也可以尝试使用FORALL将数据插入表中,但这可能很棘手,因为月份必须更改4次

基于此示例代码可以是:

 DECLARE

l_remaining_mnths         NUMBER;
TYPE tab_sho IS TABLE OF sho_table%ROWTYPE
INDEX BY BINARY_INTEGER;
l_tab tab_sho;
l_month  VARCHAR2(100);
j        NUMBER := 0;
BEGIN

  SELECT 12 - EXTRACT(MONTH FROM sysdate)
  INTO l_remaining_mnths
  FROM dual;

  SELECT *
  BULK COLLECT INTO l_tab
  FROM sho_table
  WHERE flag = 'current';

  dbms_output.put_line('total records-->'||l_tab.COUNT);

  FOR i in 1..l_remaining_mnths
  LOOP
    SELECT TO_CHAR(ADD_MONTHS(sysdate,i),'Month')||19
    INTO l_month
    FROM dual;

      dbms_output.put_line('l_tab(i).month_year -->'||l_tab(i).month_year);

      FOR j IN l_tab.FIRST..l_tab.LAST
      LOOP
        l_tab(j).month_year := l_month;

        INSERT INTO sho_table
        (
        month_year
        ,column2
        ,flag
        )
        VALUES
        (
        l_tab(j).month_year
        ,'newvalue'
        ,'future'
        );

      END LOOP;

    EXIT WHEN SQL%NOTFOUND;

  END LOOP;
  /*
      dbms_output.put_line('Before for all');
      FORALL j IN 1..l_tab.COUNT
      INSERT INTO sho_table
      VALUES l_tab(j);
      dbms_output.put_line('after for all');
  */
EXCEPTION
WHEN OTHERS THEN
     dbms_output.put_line('We are in the exception  '||SQLERRM);

END;