获取带有或者条件的重复行

时间:2013-03-26 04:34:40

标签: sql

我正在尝试找到在特定时间段内工作的员工以及他们在该时间段内工作的时间。我的查询必须加入一个具有员工ID为pk和使用EFFECTIVE_DATE和到期日期为员工&#39时措施的职员表; s到具有支付周期的ID号PK,也是报时表位置使用有效日期和到期日期

员工表中的失效日期问题是,如果雇员当前就业,那么日期是“#33; 12/31/9999”。我正在寻找在某一年工作的员工和现在的员工,以及按工资期间分开工作的时间。

当我在带有OR声明的地方考虑这个条件时,我得到的重复是那些在我正在寻找的时间段内工作的员工以及' 12/31的重复记录/ 9999'和那段时间内的有效员工。

这是我正在使用的查询:

SELECT
            J.EMPL_ID
            ,J.DEPT
            ,J.UNIT
            ,J.LAST_NM
            ,J.FIRST_NM
            ,J.TITLE 
            ,J.EFF_DT
            ,J.EXP_DT
            ,TM1.PPRD_ID
            ,TM1.EMPL_ID
            ,TM1.EXP_DT
            ,TM1.EFF_DT

            --PULLING IN THE DAILY HRS WORKED
             ,(SELECT NVL(SUM(((to_number(SUBSTR(TI.DAY_1, 1
                            ,INSTR(TI.DAY_1, ':', 1, 1)-1),99))*60)+
                (TO_NUMBER(SUBSTR(TI.DAY_1
                            ,INSTR(TI.DAY_1,':', -1, 1)+1),99))),0)
              FROM PPRD_LINE TI
              WHERE
              TI.PPRD_ID=TM1.PPRD_ID
              ) "DAY1"
             ---AND THE REST OF THE DAYS FOR THE WORK PERIOD
    FROM    PPRD_LINE TM1
    JOIN    EMPL J ON TM1.EMPL_ID=J.EMPL_ID

 WHERE
    J.EMPL_ID='some id number' --for test purposes, will need to break down to depts-
    AND
    J.EFF_DT >=TO_DATE('1/1/2012','MM/DD/YYYY')
    AND
    (
    J.EXP_DT<=TO_DATE('12/31/2012','MM/DD/YYYY')
    OR
    J.EXP_DT=TO_DATE('12/31/9999','MM/DD/YYYY') --I think the problem might be here???
    )

GROUP BY

    J.EMPL_ID
    ,J.DEPT
    ,J.UNIT
    ,J.LAST_NM
    ,J.FIRST_NM
    ,J.TITLE 
    ,J.EFF_DT
    ,J.EXP_DT
    ,TM1.PPRD_ID
    ,TM1.EMPL_ID
    ,TM1.DOC_ID
    ,TM1.EXP_DT
    ,TM1.EFF_DT

ORDER BY
    J.EFF_DT
    ,TM1.EFF_DT
    ,TM1.EXP_DT

我很确定我错过了一些简单的东西但是在这一点上我无法看到森林中的树木。任何人都可以指出我正确的方向吗?

重复记录的示例:

2012年员工1:

Empl_ID Dept Unit   Last     First   Title   Eff Date Exp Date   PPRD ID Empl_ID
00001   04   012    Babbage  Charles Somejob 4/1/2012 10/15/2012 0407123 00001 

Exp Date_1 Eff Date_1
4/15/2012  4/1/2012

此记录重复3次并超过2012年的支付期至2013年的当前支付期

我用来转换时间的子查询,可以将hrs和mins一起添加到比较行中。

1 个答案:

答案 0 :(得分:0)

我会猜测一下,看看这是不是你想要的,记住我无法测试,所以可能会有拼写错误。

如果是这样,特别是如果不是,您应该阅读常见问题解答,了解如何提出好的问题。如果这是您试图理解的问题,那么您的问题应该在大约10分钟内得到解答。因为不清楚你在问什么,没有人能回答你的问题。

您应该在问题中包含输入和输出以及EXPECTED输出。您提供的数据不是select语句的输出(它没有DAY1列)。

SELECT
   J.EMPL_ID
   ,J.DEPT
   ,J.UNIT
   ,J.LAST_NM
   ,J.FIRST_NM
   ,J.TITLE 
   ,J.EFF_DT
   ,J.EXP_DT
   ,TM1.PPRD_ID
   ,TM1.EMPL_ID
--  ,TM1.EXP_DT  Can't have these if you are summing accross multiple records.
--   ,TM1.EFF_DT
   --PULLING IN THE DAILY HRS WORKED
   ,NVL(SUM(((to_number(SUBSTR(TM1.DAY_1, 1,INSTR(TM1.DAY_1, ':', 1, 1)-1),99))*60)+
             (TO_NUMBER(SUBSTR(TM1.DAY_1,INSTR(TM1.DAY_1,':', -1, 1)+1),99))),0)
               "DAY1"
             ---AND THE REST OF THE DAYS FOR THE WORK PERIOD
FROM    PPRD_LINE TM1
JOIN    EMPL J ON TM1.EMPL_ID=J.EMPL_ID
WHERE
  J.EMPL_ID='some id number' --for test purposes, will need to break down to depts-

  AND J.EFF_DT >=TO_DATE('1/1/2012','MM/DD/YYYY')  
  AND(J.EXP_DT<=TO_DATE('12/31/2012','MM/DD/YYYY') OR J.EXP_DT=TO_DATE('12/31/9999','MM/DD/YYYY'))
GROUP BY
    J.EMPL_ID
   ,J.DEPT
   ,J.UNIT
   ,J.LAST_NM
   ,J.FIRST_NM
   ,J.TITLE 
   ,TM1.PPRD_ID
   ,TM1.EMPL_ID
   ,TM1.DOC_ID
ORDER BY
    MIN(J.EFF_DT)
   ,MAX(TM1.EFF_DT)
   ,MAX(TM1.EXP_DT)