通过使用SQL我需要得到下面提到的结果

时间:2016-03-24 06:25:03

标签: sql oracle

我有2张表,其中包含以下类型的数据。

Shiftshiftcode varchar2(10)

shiftcode
A
B
C 

emp_dtsn number(10), empno number(10), dt date

SN  Empno   Date
1   157 01/01/2016
2   157 02/01/2016
3   157 03/01/2016
4   157 04/01/2016
5   157 05/01/2016
6   157 06/01/2016
7   157 07/01/2016
8   157 08/01/2016
9   157 09/01/2016
10  157 10/01/2016
11  157 11/01/2016
12  157 12/01/2016

在这里,我需要通过轮换代码的轮换来映射每个员工。

如果员工班次以B开头,那么它必须像B,A,C,A,B,C ......那样旋转......

我们正在使用toad进行开发。通过使用sql或pl / sql我需要得到我的结果。

我的结果应该是

SN  Emp No  Date    Shift Code
1   157 01/01/2016  B
2   157 02/01/2016  C
3   157 03/01/2016  A
4   157 04/01/2016  B
5   157 05/01/2016  C
6   157 06/01/2016  A
7   157 07/01/2016  B
8   157 08/01/2016  C
9   157 09/01/2016  A
10  157 10/01/2016  B
11  157 11/01/2016  C
12  157 12/01/2016  A

2 个答案:

答案 0 :(得分:1)

您可以使用SN列的模数来指定移位代码。

(在这种情况下使用数字更容易,所以考虑移位代码A = 0,B = 1,C = 2)

select SN,empno,dt, mod((SN-1),3) shift_no
from emp_dt

对于模数,我使用了SN-1,因此第一个记录(SN = 1)的结果与移位代码A相对应。

结果应该是这样的:

SN  Emp No  Date    shift_no
1   157 01/01/2016  0 // A
2   157 02/01/2016  1 // B
3   157 03/01/2016  2 // C

如果在emp_dt表中为初始移位代码添加一列,则只需将其添加到模数

select SN,empno,dt, mod((SN-1)+init_shiftcode,3) shift_no
from emp_dt

对于具有init_shiftcode 1(=班次代码B)的员工,结果将是:

SN  Emp No  Date    shift_no
1   157 01/01/2016  1 // B
2   157 02/01/2016  2 // C
3   157 03/01/2016  0 // A
...

答案 1 :(得分:0)

尝试以下。您仍然需要加入班次代码表。

SELECT DISTINCT SN
    ,EmpNO
    ,convert(DATE, DATE) dt
    ,CASE 
        WHEN DATENAME(dw, DATE) = 'Monday'
            THEN 'B'
        WHEN DATENAME(dw, DATE) = 'Tuesday'
            THEN 'C'
        WHEN DATENAME(dw, DATE) = 'Wednesday'
            THEN 'A'
        WHEN DATENAME(dw, DATE) = 'Thursday'
            THEN 'B'
        WHEN DATENAME(dw, DATE) = 'Friday'
            THEN 'C'
        WHEN DATENAME(dw, DATE) = 'Saturday'
            THEN 'A'
        WHEN DATENAME(dw, DATE) = 'Sunday'
            THEN 'B'
        END
FROM emp_dt