2013-05-06 125 views
0

在查询中,我想检查员工(表EMPLOYEE)是否在过去一年中每个月至少有一个期间(期间在表PERIOD中)工作。之后,我希望获得员工每个月工作日的平均时间。任何人都可以提供解决方案/解释?SQL Server 2008检索数据查询

职员表:

USE [MetukisDB] 
GO 

/****** Object: Table [dbo].[TblEmployee] Script Date: 05/06/2013 23:10:17 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[TblEmployee](
    [employeeNumber] [char](8) NOT NULL, 
    [employeePrivateName] [varchar](20) NOT NULL, 
    [employeeFamilyName] [varchar](20) NOT NULL, 
    [city] [varchar](20) NULL, 
    [street] [varchar](20) NULL, 
    [houseNo] [int] NULL, 
    [phoneNumber] [char](10) NULL, 
    [birthDate] [datetime] NULL, 
    [startWorkingDate] [datetime] NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [employeeNumber] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

ALTER TABLE [dbo].[TblEmployee] WITH CHECK ADD CHECK (([employeeNumber] like '[1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9]')) 
GO 

ALTER TABLE [dbo].[TblEmployee] WITH CHECK ADD CHECK (([houseNo]>(0))) 
GO 

ALTER TABLE [dbo].[TblEmployee] WITH CHECK ADD CHECK (([phoneNumber] like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')) 
GO 

周期表:

USE [MetukisDB] 
GO 

/****** Object: Table [dbo].[TblPeriod] Script Date: 05/06/2013 23:11:46 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[TblPeriod](
    [Number] [int] NOT NULL, 
    [fromDate] [datetime] NULL, 
    [toDate] [datetime] NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [Number] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[TblPeriod] WITH CHECK ADD CONSTRAINT [fromDate_check] CHECK (([fromDate]<=[toDate])) 
GO 

ALTER TABLE [dbo].[TblPeriod] CHECK CONSTRAINT [fromDate_check] 
GO 

ALTER TABLE [dbo].[TblPeriod] WITH CHECK ADD CONSTRAINT [Number] CHECK (([Number]>(0))) 
GO 

ALTER TABLE [dbo].[TblPeriod] CHECK CONSTRAINT [Number] 
GO 

计划表:

USE [MetukisDB] 
GO 

/****** Object: Table [dbo].[TblScheduled] Script Date: 05/07/2013 15:17:59 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[TblScheduled](
    [jobNumber] [int] NOT NULL, 
    [employeeNumber] [char](8) NOT NULL, 
    [machineNumber] [int] NOT NULL, 
    [Number] [int] NOT NULL, 
CONSTRAINT [scheduled_PK] PRIMARY KEY CLUSTERED 
(
    [jobNumber] ASC, 
    [employeeNumber] ASC, 
    [machineNumber] ASC, 
    [Number] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

ALTER TABLE [dbo].[TblScheduled] WITH CHECK ADD CONSTRAINT [certified_period_FK] FOREIGN KEY([jobNumber], [employeeNumber], [machineNumber]) 
REFERENCES [dbo].[TblCertified] ([jobNumber], [employeeNumber], [machineNumber]) 
ON UPDATE CASCADE 
GO 

ALTER TABLE [dbo].[TblScheduled] CHECK CONSTRAINT [certified_period_FK] 
GO 

ALTER TABLE [dbo].[TblScheduled] WITH CHECK ADD CONSTRAINT [Number_FK] FOREIGN KEY([Number]) 
REFERENCES [dbo].[TblPeriod] ([Number]) 
ON UPDATE CASCADE 
GO 

ALTER TABLE [dbo].[TblScheduled] CHECK CONSTRAINT [Number_FK] 
GO 

这是我到目前为止有:

select TblEmployee.employeeNumber 
from TblEmployee 
where(DATEDIFF(year, TblEmployee.birthDate, GETDATE())>25) 
select TblSnack.productNumber, TblProduces.machineNumber, TblCertified.employeeNumber 
from TblSnack inner join TblProduces on TblProduces.productNumber= TblSnack.productNumber 
inner join TblCertified on TblCertified.machineNumber= TblProduces.machineNumber inner join 
TblChocolate on TblChocolate.productNumber=TblProduces.productNumber 
where(TblSnack.containGluten=0) and (TblSnack.containSoy=0) 
group by TblProduces.machineNumber, TblCertified.employeeNumber, tblsnack.productNumber 
having (COUNT(TblChocolate.productNumber) > 1) 
select TblScheduled.Number, TblScheduled.employeeNumber 
from TblScheduled 
where TblScheduled.Number= (SELECT number 
FROM TblPeriod 
WHERE (MONTH(TblPeriod.fromDate)) = month (dateAdd (month,-1,GETDATE()))) 
group by TblScheduled.Number, TblScheduled.employeeNumber 
+0

你先走了吗?向我们尽你最大的努力。还要添加你的表格定义。 – 2013-05-06 20:03:45

+0

这是一个非常长的查询,这是缺少的一个元素。如果我有东西要分享,我会有 – user2023203 2013-05-06 20:05:37

+0

除非你想让你的问题得到最终结果并最终结束,否则我强烈建议你提供**相关**代码和**相关**数据。 – 2013-05-06 20:07:33

回答

1

尝试这样的事情你的第一个问题:

-- Employees who have worked at least one period each month in the past year 
SELECT t.employeeNumber, 
t.employeeFamilyName 
FROM 
(SELECT TblEmployee.employeeNumber, 
TblEmployee.employeeFamilyName, 
COUNT(MONTH(TblPeriod.fromDate)) AS MonthCount 
FROM TblEmployee 
JOIN TblScheduled 
ON TblScheduled.employeeNumber = TblEmployee.employeeNumber 
JOIN TblPeriod 
ON TblPeriod.Number = TblScheduled.Number 
WHERE TblPeriod.fromDate >= DATEADD(YEAR,-1,GETDATE()) 
GROUP BY TblEmployee.employeeNumber, 
TblEmployee.employeeFamilyName, 
MONTH(TblPeriod.fromDate)) AS t 
WHERE t.MonthCount = 12 
GROUP BY t.employeeNumber, 
t.employeeFamilyName 

而且像这样关于第二个问题:

-- Average number of the days the employee has worked each month 
SELECT t.employeeNumber, 
t.employeeFamilyName, 
AVG(t.ScheduleCount) AS AverageCount 
FROM 
(SELECT TblEmployee.employeeNumber, 
TblEmployee.employeeFamilyName, 
MONTH(TblPeriod.fromDate) AS PeriodMonth, 
COUNT(TblScheduled.Number) AS ScheduleCount 
FROM TblEmployee 
JOIN TblScheduled 
ON TblScheduled.employeeNumber = TblEmployee.employeeNumber 
JOIN TblPeriod 
ON TblPeriod.Number = TblScheduled.Number 
WHERE TblPeriod.fromDate >= DATEADD(YEAR,-1,GETDATE()) 
GROUP BY TblEmployee.employeeNumber, 
TblEmployee.employeeFamilyName, 
MONTH(TblPeriod.fromDate)) AS t 
GROUP BY t.employeeNumber, 
t.employeeFamilyName 

注意该使用外键和主键如何加入三个表。 GROUP BY允许我们例如对TblScheduled中的条目进行计数。

+0

我已更新,将更多字段添加到GROUP BY子句。 – criticalfix 2013-05-07 12:29:48

+0

@ user2023203,我添加了“每个月至少有一个期间”的查询,并在“查询天数”中添加了一个平均值。还修复了错位的逗号。请让我知道,如果你看到任何语法问题。我希望这有帮助! – criticalfix 2013-05-07 14:00:46

+0

然而,非常感谢您的解决方案无法正常工作。我总是在查询中得到一个1的平均值,并且我没有得到每月一个时间段工作的peapole的数量...... – user2023203 2013-05-07 15:22:21