我正在为我工作的公司的桌面支持团队写一份报告。该报告需要在从 ASP.NET 应用程序传入的指定时间范围内生成一组新的启动器。目前我们的 Worker 表和 Contract 表之间是一对多的关系。我们雇佣了很多承包商,他们有时会在几个月后回来,但仍然被视为新的初学者,因为新机器需要与桌面空间一起配置。
每次薪酬审查、职位变更和新员工都会添加一份新合同。我们需要过滤掉除新首发之外的所有内容。为工作变动和薪酬审查添加的最新合同自然总是在前一个合同的结束日期之后一天。由于我在宏伟的计划中仍然是一个新手,我正在努力使用一组我试图用来实现我的目标的功能。
WHERE
(dbo.[Contract].StartDate BETWEEN @StartDateF AND @EndDateF) AND DATEDIFF(day, SELECT MAX(StartDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID, SELECT MAX(EndDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID)> 1
如果当前有效的合同与之前的合同有一天不同,我基本上想在员工有多个合同的情况下找出,无论离开和回来还是支付审查。根据我的想法,这应该只给我所有新的开始。
问题是我仍在努力弄清楚何时使用不在选择中的聚合函数以及何时应用 HAVING 子句。
任何帮助将不胜感激,以帮助我理解为什么我缺乏理解导致此查询/逻辑失败。
谢谢
编辑
好的,我仍然在抨击这个解决方案,这在语法上是不正确的。为了消除这里的一些歧义,查询是带有更新的;
Declare @StartDateF varchar(10)
Set @StartDateF = '2012-08-03'
Declare @EndDateF varchar(10)
Set @EndDateF = '2012-09-04'
SELECT w1.Worker_ID, w1.Title, w1.FirstName, w1.Surname,w1.Gender, w1.DateofBirth,
dbo.[Contract].StartDate, (select w2.surname + ',' + w2.firstname from worker w2 WITH (NOLOCK) where w2.worker_ID = w1.manager)as Manager, dbo.Grade.GradeDescription AS JobTitle, dbo.Grade.Discipline,
CASE WHEN dbo.[Contract].ContractType_ID = 1 OR dbo.[Contract].ContractType_ID = 2 OR dbo.[Contract].ContractType_ID = 5 OR dbo.[Contract].ContractType_ID = 6
THEN 'Staff' ELSE 'Contractor' END AS ContractType
FROM dbo.Worker w1 WITH (NOLOCK) inner join
dbo.[Contract] WITH (NOLOCK) ON dbo.[Contract].Worker_ID = w1.Worker_ID inner join
dbo.Grade WITH (NOLOCK) ON dbo.Grade.Grade_ID = dbo.[Contract].Grade_ID
WHERE
(dbo.[Contract].StartDate BETWEEN @StartDateF AND @EndDateF AND EndDate IS NULL)
group by
w1.Worker_ID, w1.Title, w1.FirstName, w1.Surname,w1.Gender, w1.DateofBirth,
dbo.[Contract].StartDate, manager, dbo.Grade.Discipline,dbo.Grade.GradeDescription, dbo.[Contract].ContractType_ID
Having DATEDIFF(day, SELECT MAX(StartDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID, SELECT MAX(EndDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID)
我已经添加了 group by 和 having 子句,但现在我收到以下错误
消息 156,级别 15,状态 1,第 24 行关键字“SELECT”附近的语法不正确。消息 102,级别 15,状态 1,第 24 行 ',' 附近的语法不正确。消息 102,级别 15,状态 1,第 24 行 ')' 附近的语法不正确。
毫无疑问,这些都与have子句中的功能有关,您可以看到。但我不明白这个查询有什么问题,这主要是问题所在。我需要充分了解 SQL 函数,以便我可以实施正确的解决方案。
我在这里跟进了 DATEDIFF() 函数http://msdn.microsoft.com/en-us/library/ms189794.aspx
根据 MS 文档,我可以看到在此函数中使用函数是可以接受的。
编辑
注释掉 Have 子句给了我我期望的结果集。它向人们展示了合同变更(加薪),但这是没有人应该看到的信息,这些是现在唯一需要过滤掉的记录
编辑
我现在已经做了一些改进并克服了错误消息,但我仍然让人们知道发生了加薪。这是来自 group by 的修改后的查询
group by
w1.Worker_ID, w1.Title, w1.FirstName, w1.Surname,w1.Gender, w1.DateofBirth,
dbo.[Contract].StartDate, manager, dbo.Grade.Discipline,dbo.Grade.GradeDescription, dbo.[Contract].ContractType_ID, w1.Worker_ID
Having
(((dbo.[Contract].StartDate BETWEEN @StartDateF AND @EndDateF)
AND COUNT(dbo.[Contract].Worker_ID) = 1)
OR
((dbo.[Contract].StartDate BETWEEN @StartDateF AND @EndDateF)
AND DATEDIFF(day, (SELECT MAX(EndDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID), (SELECT MAX(StartDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID))>1))