【问题标题】:SQL SELECT Query for a Total and parts building the totalSQL SELECT 查询总计和构建总计的部分
【发布时间】: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


【解决方案1】:
SELECT 
  dbo.Job.BatchID,
  COUNT(dbo.Job.OID) AS Total,
  COUNT(CASE WHEN JobStatusID = 1 THEN 1 END) AS [Ready to book],
  COUNT(CASE WHEN JobStatusID = 2 THEN 1 END) AS [Pending],
  COUNT(CASE WHEN JobStatusID = 3 THEN 1 END) AS [Booked],
  COUNT(CASE WHEN JobStatusID = 4 THEN 1 END) AS [Cancelled],
  COUNT(CASE WHEN JobStatusID = 6 THEN 1 END) AS [CallBack],
  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, '2000-01-01 00:00:00', 102))
ORDER BY
  dbo.JobBatch.BatchDate,
  Total DESC

【讨论】:

  • 大目标!一百万,兄弟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 2012-05-10
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多