簡體   English   中英

SQL Server 2008檢索數據查詢

[英]SQL Server 2008 Retrieving data query

在查詢中,我想檢查一個雇員(表EMPLOYEE)在過去一年中每個月是否至少工作了一個時期(期間在表PERIOD中)。 在那之后,我想得到員工每個月工作的天數。 誰能提供解決方案/解釋?

員工表:

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

對您的第一個問題嘗試以下方法:

-- 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中的條目進行計數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM