SQL显示缺少哪些条目

时间:2016-05-06 11:46:31

标签: sql sql-server sql-server-2012

我正在尝试在MSSQL中创建一个异常报告。

在我们的Payroll软件中,我们每周都有两个流程。我们计算员工累积和休假的假期,然后我们需要重置应计假期,这样他们可能会在下周累积更多,而不会达到限制。这一切都在一个名为PRLH的表中完成。这是表格的较小版本,没有杂乱。这个重置过程需要每周完成,否则修复它是一项艰巨的任务。 (我今天花了4.75个小时来解决我们的薪资管理员在5周前忘记重置时所犯的错误。)

PRLH

| PRCo | PREndDate           | Employee | LeaveCode | ActDate             | Type |
| 3    | 2016-03-05 00:00:00 | 3        | ALH       | 2016-01-24 00:00:00 | A    |   
| 3    | NULL                | 3        | ALH       | 2016-01-26 00:00:00 | R    |

PRLV

| PRCo | LeaveCode           | AccType |
| 3    | ALH                 | R       |
| 4    | FLY                 | F       |

PRCo是公司编号。 PREndDate只适用于Type为'U'或'A'且它是周结束日期(对我们来说它总是星期二),否则如果它的类型为'R'则为null,ActDate是它实际发生的日期,ActDate与R型应始终在星期二。类型为“R”,“U”,“A”(重置,使用,应计)。

我正在寻找的是一个声明,它将向我显示PRCo,PREndDate和LeaveCode的任意组合,其中ActDate与上周二的类型R不存在,但是如果LeaveCodes AccType是,我想要排除它'F'。这将在每周三/周四进行。我一直在使用这个公式来让我得到我需要的星期二。

DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 1)

这是一个示例表:

| PRCo | PREndDate           | Employee | LeaveCode | ActDate             | Type |
| 3    | 2016-03-05 00:00:00 | 3        | ALH       | 2016-01-24 00:00:00 | A    |   
| 1    | 2016-03-05 00:00:00 | 3        | PLH       | 2016-01-23 00:00:00 | A    |
| 1    | NULL                | 3        | PLH       | 2016-01-26 00:00:00 | R    |
| 4    | 2016-03-05 00:00:00 | 3        | FLY       | 2016-01-23 00:00:00 | A    |

我希望它返回

| PRCo | PREndDate           | LeaveCode |
| 3    | 2016-03-05 00:00:00 | ALH       |

我对SQL很新,我只知道JOINS的基本SELECT语句而且数量不多,这超出了我的范围,我试图尝试完成这项工作,但到目前为止还没有成功。

修改

由于样本数据有限,我无法对其进行真正的测试,但是下面的代码稍微修改了Sunny的内容似乎给了我想要的东西。

Select  DISTINCT(a.PREndDate) as EndDate, a.PRCo, a.LeaveCode
From    PRLH a  Inner Join PRLV b
                on a.PRCo = b.PRCo
                Left Outer Join
                (Select PRCo, PREndDate
                    From    PRLH
                    Where   [Type]  = 'R'
                    And     ActDate = DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 1)) as c
        on  a.PRCo = c.PRCo
Where   c.PRCo IS NULL
AND     b.AccType <> 'F' AND a.PRCo < 100

1 个答案:

答案 0 :(得分:1)

如果我的例子和要求正确,这应该有帮助.....

Select  a.PRCo, a.PREndDate, a.LeaveCode
From    PRLH a  Inner Join PRLV b
                on a.PRCo = b.PRCo
                Left Outer Join
                (Select PRCo, PREndDate
                    From    PRLH
                    Where   [Type]  = 'R'
                    And     ActDate = DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 1)) as c
        on  a.PRCo = c.PRCo
Where   c.PRCo IS NULL
AND     b.AccType <> 'F'