簡體   English   中英

如何基於其他表中各列的總和向表中插入值?

[英]How to insert values into a table BASED on sum values of columns in other tables?

使用Oracle SQL Developer的最佳方法是什么?

我需要檢查表Primary中的14天(兩周的mon_wk_1,tue_wk_2等。)列,以查看一周中的任意一天是否指示了小時,如果有,則將當天的小時值插入相應的字段中load_table。

如果主表中的任何一天都沒有小時,則檢查輔助表中的14天列以查看是否有小時,然后使用輔助表的值插入到load_table中。 如果主表和輔助表在這兩周中均未顯示任何時間,則使用默認表中默認記錄中的客戶端值。

我正在考慮對天數求和,然后如果sum> 0使用主表值進行插入,如果使用某些<0,則不確定如何設置(如果需要使用Default值)。 有一個更好的方法嗎

像這樣:

BEGIN
IF
SELECT (SUM   
        (NVL(MON_HRS_1,0) +
        NVL(TUE_HRS_1,0) +
        NVL(WED_HRS_1,0) +
        NVL(THUR_HRS_1,0) +
        NVL(FRI_HRS_1,0) +
        NVL(SAT_HRS_1,0) +
        NVL(SUN_HRS_1,0) +
        NVL(MON_HRS_2,0) +
        NVL(TUE_HRS_2,0) +
        NVL(WED_HRS_2,0) +
        NVL(THUR_HRS_2,0) +
        NVL(FRI_HRS_2,0) +
        NVL(SAT_HRS_2,0) +
        NVL(SUN_HRS_2,0)) AS TOTAL
FROM   PRIMARY_TABLE PT
                   JOIN EMPLOYEE E
                                ON PT.CLIENT_ID = E.CLIENT_ID
                                AND PT.EE_ID = E.EE_ID
WHERE CLIENT_ID = 'FOOBAR') >0
THEN
INSERT INTO LOAD_TABLE
        SELECT
        E.EMPLOYEE_NAME,
        E.EMPLOYEE_NUMBER,
        E.EE_ID,
  PT.NVL(MON_HRS_1,0),
        PT.NVL(TUE_HRS_1,0),
        PT.NVL(WED_HRS_1,0),
        PT.NVL(THUR_HRS_1,0),
        PT.NVL(FRI_HRS_1,0),
        PT.NVL(SAT_HRS_1,0),
        PT.NVL(SUN_HRS_1,0),
        PT.NVL(MON_HRS_2,0),
        PT.NVL(TUE_HRS_2,0),
        PT.NVL(WED_HRS_2,0),
        PT.NVL(THUR_HRS_2,0),
        PT.NVL(FRI_HRS_2,0),
        PT.NVL(SAT_HRS_2,0),
        PT.NVL(SUN_HRS_2,0),
                DATE(SYSDATE),              
                1 AS USER_ID
                FROM   PRIMARY_TABLE PT
                                 JOIN EMPLOYEE E
                                  ON PT.CLIENT_ID = E.CLIENT_ID
                                  AND PT.EE_ID = E.EE_ID
        WHERE CLIENT_ID = 'FOOBAR');
ELSE
INSERT INTO LOAD_TABLE
                (
                SELECT
                E.EMPLOYEE_NAME,
                E.EMPLOYEE_NUMBER,
                E.EE_ID,
                PT.NVL(MON_HRS_1,0),
        PT.NVL(TUE_HRS_1,0),
        PT.NVL(WED_HRS_1,0),
        PT.NVL(THUR_HRS_1,0),
        PT.NVL(FRI_HRS_1,0),
        PT.NVL(SAT_HRS_1,0),
        PT.NVL(SUN_HRS_1,0),
        PT.NVL(MON_HRS_2,0),
        PT.NVL(TUE_HRS_2,0),
        PT.NVL(WED_HRS_2,0),
        PT.NVL(THUR_HRS_2,0),
        PT.NVL(FRI_HRS_2,0),
        PT.NVL(SAT_HRS_2,0),
        PT.NVL(SUN_HRS_2,0),
                DATE(SYSDATE),              
                1 AS USER_ID
                FROM   SECONDAY_TABLE PT
                                 JOIN EMPLOYEE E
                                  ON PT.CLIENT_ID = E.CLIENT_ID
                                  AND PT.EE_ID = E.EE_ID
        WHERE CLIENT_ID = 'FOOBAR'
                );
END IF;
END;

數據源表:

主表

EE_ID   VARCHAR2,
CLIENT_ID VARCHAR2,
MON_HRS_1 NUMBER,
TUE_HRS_1 NUMBER,
WED_HRS_1 NUMBER,
THUR_HRS_1 NUMBER,
FRI_HRS_1 NUMBER,
SAT_HRS_1 NUMBER,
SUN_HRS_1 NUMBER,
MON_HRS_2 NUMBER,
TUE_HRS_2 NUMBER,
WED_HRS_2 NUMBER,
THUR_HRS_2 NUMBER,
FRI_HRS_2 NUMBER,
SAT_HRS_2 NUMBER,
SUN_HRS_2 NUMBER,
ACTUAL_HRS_WK NUMBER,
COMMENTS VARCHAR2

二次表

EE_ID   VARCHAR2,
CLIENT_ID VARCHAR2,
SCHEDULE_ID VARCHAR2
MON_HRS_1 NUMBER,
TUE_HRS_1 NUMBER,
WED_HRS_1 NUMBER,
THUR_HRS_1 NUMBER,
FRI_HRS_1 NUMBER,
SAT_HRS_1 NUMBER,
SUN_HRS_1 NUMBER,
MON_HRS_2 NUMBER,
TUE_HRS_2 NUMBER,
WED_HRS_2 NUMBER,
THUR_HRS_2 NUMBER,
FRI_HRS_2 NUMBER,
SAT_HRS_2 NUMBER,
SUN_HRS_2 NUMBER,
ACTUAL_HRS_WK NUMBER,
COMMENTS VARCHAR2

Client_default

CLIENT_ID VARCHAR2,
MON_HRS_1 NUMBER,
TUE_HRS_1 NUMBER,
WED_HRS_1 NUMBER,
THUR_HRS_1 NUMBER,
FRI_HRS_1 NUMBER,
SAT_HRS_1 NUMBER,
SUN_HRS_1 NUMBER,
MON_HRS_2 NUMBER,
TUE_HRS_2 NUMBER,
WED_HRS_2 NUMBER,
THUR_HRS_2 NUMBER,
FRI_HRS_2 NUMBER,
SAT_HRS_2 NUMBER,
SUN_HRS_2 NUMBER,
ACTUAL_HRS_WK NUMBER

負荷表

EMPLOYEE_NAME VARCHAR2,
EMPLOYEE_NUMBER NUMBER,
EE_ID VARCHAR VARCHAR2,
MON_HRS_1 NUMBER,
TUE_HRS_1 NUMBER,
WED_HRS_1 NUMBER,
THUR_HRS_1 NUMBER,
FRI_HRS_1 NUMBER,
SAT_HRS_1 NUMBER,
SUN_HRS_1 NUMBER,
MON_HRS_2 NUMBER,
TUE_HRS_2 NUMBER,
WED_HRS_2 NUMBER,
THUR_HRS_2 NUMBER,
FRI_HRS_2 NUMBER,
SAT_HRS_2 NUMBER,
SUN_HRS_2 NUMBER,
CREATE_DATE DATETIME,
USER_ID VARCHAR2

EMPLOYEE_TABLE

EMPLOYEE_NAME,
EMPLOYEE_NUMBER,
EE_ID,
DEPARTMENT,
SSN

想出一種方法來做到這一點。 我基本上是用數學來累加14天的時間,並通過子查詢加入結果集。 然后在我的SELECT中使用Case語句和嵌套的case語句來選擇要設置的星期幾值。

討厭不得不多次加入一個表,但這似乎最適合我需要的工作。

在高處看起來像這樣:

SELECT CLIENT_ID, CASE WHEN PT_WK_HRS.TOTAL > 0 THEN CASE WHEN SEC_WK_HRS.TOTAL >0 THEN ST.MON_HRS_1 ELSE CD.MON_HRS_1 END ELSE PT.MON_HRS_1 END AS WS_MON_HRS_1, CASE WHEN PT_WK_HRS.TOTAL > 0 THEN CASE WHEN SEC_WK_HRS.TOTAL >0 THEN ST.TUE_HRS_1 ELSE CD.TUE_HRS_1 END ELSE PT.TUE_HRS_1 END AS WS_TUE_HRS_1 ----AND SO ON FOR EACH DAY OF THE WEEK
FROM PRIMARY TABLE PT JOIN (SELECT PT.CLIENT_ID. SUM (NVL(MON_HRS_1,0) + NVL(TUE_HRS_1,0) + NVL(WED_HRS_1,0) + NVL(THUR_HRS_1,0) + NVL(FRI_HRS_1,0) + NVL(SAT_HRS_1,0) + NVL(SUN_HRS_1,0) + NVL(MON_HRS_2,0) + NVL(TUE_HRS_2,0) + NVL(WED_HRS_2,0) + NVL(THUR_HRS_2,0) + NVL(FRI_HRS_2,0) + NVL(SAT_HRS_2,0) + NVL(SUN_HRS_2,0)) AS TOTAL FROM PRIMARY_TABLE GROUP BY CLIENT_ID) AS PT_WK_HRS ON PT.CLIENT_ID = PT_WK_HRS. CLIENT_ID JOIN SECONDARY_TABLE ST ON PT.CLIENT_ID = ST.CLIENT_ID JOIN ( SELECT PT.CLIENT_ID. SUM (NVL(MON_HRS_1,0) + NVL(TUE_HRS_1,0) + NVL(WED_HRS_1,0) + NVL(THUR_HRS_1,0) + NVL(FRI_HRS_1,0) + NVL(SAT_HRS_1,0) + NVL(SUN_HRS_1,0) + NVL(MON_HRS_2,0) + NVL(TUE_HRS_2,0) + NVL(WED_HRS_2,0) + NVL(THUR_HRS_2,0) + NVL(FRI_HRS_2,0) + NVL(SAT_HRS_2,0) + NVL(SUN_HRS_2,0)) AS TOTAL FROM SECONDARY_TABLE GROUP BY CLIENT_ID) AS SEC_WK_HRS ON PT.CLIENT_ID = SEC_WK_HRS.CLIENT_ID JOIN CLIENT_DFLT CD ON PT.CLIENT_ID = CD.CLIENT_ID

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM