【发布时间】:2010-10-20 13:05:54
【问题描述】:
我需要一个用于以下场景的 SQL Server 查询:
桌子:
CREATE TABLE [dbo].[JobStatus]
(
[OID] [int] IDENTITY(1, 1)
NOT NULL,
[Name] [varchar](100) NOT NULL,
[Code] [varchar](5) NOT NULL,
[PictureID] [int] NOT NULL,
[LastModifiedAt] [timestamp] NOT NULL,
CONSTRAINT [PK_JobStatuses] PRIMARY KEY CLUSTERED ([OID] 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
SET IDENTITY_INSERT [dbo].[JobStatus] ON
INSERT [dbo].[JobStatus]
([OID], [Name], [Code], [PictureID])
VALUES
(1, N'Ready to book', N'J_RTB', 13)
INSERT [dbo].[JobStatus]
([OID], [Name], [Code], [PictureID])
VALUES
(2, N'Pending', N'J_P', 14)
INSERT [dbo].[JobStatus]
([OID], [Name], [Code], [PictureID])
VALUES
(3, N'Booked', N'J_B', 15)
INSERT [dbo].[JobStatus]
([OID], [Name], [Code], [PictureID])
VALUES
(4, N'Cancelled', N'J_CAN', 16)
INSERT [dbo].[JobStatus]
([OID], [Name], [Code], [PictureID])
VALUES
(6, N'CallBack', N'J_CAL', 17)
SET IDENTITY_INSERT [dbo].[JobStatus] OFF
CREATE TABLE [dbo].[JobBatch]
(
[OID] [varchar](250) NOT NULL,
[UserID] [bigint] NOT NULL,
[BatchDate] [smalldatetime] NOT NULL,
[LastModifiedAt] [timestamp] NOT NULL,
CONSTRAINT [PK_JobBatches] PRIMARY KEY CLUSTERED ([OID] 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].[JobBatch] ADD CONSTRAINT [DF_JobBatch_BatchDate] DEFAULT (GETDATE()) FOR [BatchDate]
GO
CREATE TABLE [dbo].[Job]
(
[OID] [bigint] IDENTITY(1, 1)
NOT NULL,
[BatchID] [varchar](250) NOT NULL,
[PharmacyID] [bigint] NOT NULL,
[BranchID] [bigint] NOT NULL,
[CoordinatorID] [bigint] NOT NULL,
[LocumTypeID] [int] NOT NULL,
[ShiftID] [int] NOT NULL,
[JobDate] [smalldatetime] NOT NULL,
[Rate] [money] NOT NULL,
[RatePlus] [money] NOT NULL,
[StartTime] [smalldatetime] NOT NULL,
[EndTime] [smalldatetime] NOT NULL,
[PriorityID] [tinyint] NOT NULL,
[JobCode] [varchar](100) NULL,
[JobStatusID] [int] NOT NULL,
[TravelExpense] [bit] NOT NULL,
[MealAllowance] [bit] NOT NULL,
[Accommodation] [bit] NOT NULL,
[UserID] [bigint] NULL,
[RegisteredDate] [smalldatetime] NULL,
[TextSent] [bit] NOT NULL,
[BookingFee] [decimal](6, 2) NOT NULL,
[LastModifiedAt] [timestamp] NOT NULL,
CONSTRAINT [PK__Jobs__056690C222951AFD] PRIMARY KEY CLUSTERED ([OID] 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].[Job] WITH CHECK ADD CONSTRAINT [FK_Job_JobBatch] FOREIGN KEY([BatchID])
REFERENCES [dbo].[JobBatch] ([OID])
GO
ALTER TABLE [dbo].[Job] CHECK CONSTRAINT [FK_Job_JobBatch]
GO
ALTER TABLE [dbo].[Job] WITH CHECK ADD CONSTRAINT [FK_Job_JobStatus] FOREIGN KEY([JobStatusID])
REFERENCES [dbo].[JobStatus] ([OID])
GO
ALTER TABLE [dbo].[Job] CHECK CONSTRAINT [FK_Job_JobStatus]
GO
查询:
SELECT
dbo.Job.BatchID,
COUNT(dbo.Job.OID) AS Total,
dbo.JobBatch.BatchDate
FROM
dbo.Job
INNER JOIN dbo.JobBatch ON dbo.Job.BatchID = dbo.JobBatch.OID
GROUP BY
dbo.Job.BatchID,
dbo.JobBatch.BatchDate
HAVING
(dbo.JobBatch.BatchDate > CONVERT(DATETIME, '2010-08-01 00:00:00', 102))
ORDER BY
dbo.JobBatch.BatchDate,
Total DESC
现在,有一个名为 JobStatusID 的列。它包含五个代表作业状态的值。我需要这样选择的数据:
GoogleDocs Online Sample Spreadsheet
Group By 和 Have 需要保持完整。有任何想法吗?谢谢。
【问题讨论】:
-
顺便问一下,为什么
(dbo.JobBatch.BatchDate > CONVERT(DATETIME, '2000-01-01 00:00:00', 102))在HAVING子句中?在WHERE子句中可能更有效。
标签: sql sql-server sql-server-2008 pivot