2017-06-21 87 views
0

我有一個表格'table1',一年中的月份從1到12的行數以及1到31天的月份都以列的形式出現。如何比較Oracle 11g中從日期開始的月份和日期值,並在where子句中使用它?

還有另一個表'table2',其中存儲了日期和其他一些值。日期有DATE數據類型。我需要從該'table2'中獲取日期,並比較月份和日期的值,並相應地將值插入到'table1'中。 示例如果'table2'的日期是21-JUN-2017,則應在'table1'的第21列(第6天)和第6行(月)插入值。我如何在Oracle 11g中使用SQL實現相同的功能?

感謝您的幫助提前。

+0

一張表沒有固定的行數......你可以在每月的每一天有一列,在每月的每一天可以有31列,但說你有「一年中的月份從1到12排「沒有多大意義。請發佈[MCVE],包括您的表的DDL語句以及它們包含的數據的任何DML語句。 – MT0

+0

它看起來像'to_char()'與適當的格式掩碼是你在找什麼。提示,編號月份的格式爲'mm',日期格式爲'dd'。 – Boneist

+0

編輯您的問題並提供樣本數據和期望的結果。 –

回答

0

甲骨文設置

簡化您的表 - 不要存放32列(本月31日),而不是僅僅店月,日和價值PIVOT爲所需的輸出:

CREATE TABLE table1 (
    month NUMBER(2,0), 
    day NUMBER(2,0), 
    value VARCHAR2(4000) 
); 

INSERT INTO table1 
    SELECT EXTRACT(MONTH FROM date_column), 
     EXTRACT(DAY FROM date_column), 
     value 
    FROM table2; 

查詢

SELECT month, d1, d2, d3, d4, /* ..., */ d31 
FROM table1 
PIVOT (MAX(value) FOR day IN (
      1 AS d1, 2 AS d2, 3 As d3, 4 AS d4, /* ..., */ 31 AS d31 
     )); 

更新

DDL的表1: -

CREATE TABLE table1 (Month Number,1 Number,2 Number,...31 Number,); 

您可以使用:

INSERT INTO table1 
    SELECT month, d1, d2, /* ..., */ d31 
    FROM (SELECT EXTRACT(MONTH FROM date_column) AS month, 
        EXTRACT(DAY FROM date_column) AS day, 
        value 
      FROM table2) 
    PIVOT (MAX(value) FOR day IN (
      1 AS d1, 2 AS d2, /* ..., */ 31 AS d31 
     )); 

或者使用MERGE INTO如果要更新現有的行。

+0

謝謝@ MT0。你的解決方案就像一個魅力。此外,它還幫助我通過在table1中僅創建月份,日期和值列來保存數據。 –

相關問題