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