2014-04-17 66 views
0

使用Oracle SQL Developer执行此操作的最佳方式是什么?如何向表中插入值基于其他表中列的总和值?

我需要检查表Primary中的14天(两周mon_wk_1,tue_wk_2等..列),以查看是否有一周中任何一天的任何小时数,如果有,则将当天的小时数值插入load_table中的相应字段。

如果在主表中没有任何小时,则检查辅助表中的14天日期列以查看是否有任何小时,如果有,则使用次表的值插入到load_table中。如果主表和次表都没有显示这两周的任何小时数,则使用默认表中默认记录的客户端值。

我正在考虑总结几天,然后如果sum> 0使用插入的主表值,如果使用某些< 0,如果它需要使用默认值不知道如何设置。有没有更好的方式来做到这一点

事情是这样的:

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 

Load_table

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 
+0

*如果可能*,你能具体描述一下您的表结构? – abhi

+0

你好阿比!我在底部添加了数据源表。希望能帮助到你。谢谢! :D –

+0

回答了我自己的问题abhi。谢谢!!! :) –

回答

0

想出一个办法做到这一点。我基本上使用数学加起来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

+0

好工作!我很高兴你能够自己解决它。 – abhi

相关问题