从oracle

时间:2017-05-10 10:06:17

标签: sql oracle plsql

我在数据库中有两个表首先是以下内容: 第一张表是EMPSHIFT

EmployeeID   01/04/2017   02/04/2017    03/04/2017   04/04/2017   to  30/04/2017
--------------------------------------------------------------------------------
1              7,6
2
3
4

to end of all employees

第二张表是SCHEDULEEMPLOYEES

EmployeeID    DayDate           Shift
------------------------------------
1            01/04/2017          7,6
1            02/04/2017          5,2
1            03/04/2017          7,6
1            04/04/2017          9
2            01/04/2017          9
2            02/04/2017          3,2
3            01/04/2017          7,6
3            03/04/2017          9

to the end of table data

我希望make PL-SQL存储过程或SQL语句从第二个更新第一个表数据,以便在特定列日期设置移位数据 EmployeeID = 1他在2017年1月1日的班次= 7,6

我到现在为止尝试的是以下内容 What I tried till now

但不起作用可以提供任何帮助

2 个答案:

答案 0 :(得分:0)

在这种情况下,您应该使用MERGE语句,如下所示:

DECLARE
  l_date DATE:=TO_DATE('01/04/2017','DD/MM/YYYY');
BEGIN
  LOOP
    EXECUTE IMMEDIATE 'MERGE INTO EMPSHIFT E
USING SCHEDULEEMPLOYEES S
ON (S.EMPLOYEEID=E.EMPLOYEEID AND S.DAYDATE=TO_DATE('''||TO_CHAR(l_date)||''',''DD/MM/YYYY''))
WHEN MATCHED 
THEN UPDATE SET E."'||TO_CHAR(l_date)||'"=S.SHIFT';
    l_date:=l_date+1;
    EXIT
  WHEN l_date>TO_DATE('30/04/2017','DD/MM/YYYY');
  END LOOP;
END;

您提到要更新记录,但如果您想插入缺失的记录(对于EMPSHIFT表中缺少的EMPLOYEEID),请参阅merge_insert_clause

答案 1 :(得分:0)

或者你在谈论pivot / unpivot(它存在于Oracle 11g中)

SELECT *
  FROM (SELECT DayDate,
               EmployeeID,
               SUM(Shift) shift
          FROM SCHEDULEEMPLOYEES
         GROUP BY DayDate,
                  EmployeeID)
PIVOT(SUM(shift)
   FOR DayDate IN(to_date('01/04/2017',
                          'mm/dd/yyyy'),
                  to_date('02/04/2017',
                          'mm/dd/yyyy'),
                  to_date('03/04/2017',
                          'mm/dd/yyyy'),
                  to_date('04/04/2017',
                          'mm/dd/yyyy')));