Database design E保留表具有资源表中的匹配时段列。当在资源可用的时间段内进行预订时,将在列中放置一个“真值”。可用于预订的资源由找到 聚集当天每个时段的预订值 建立可用资源的列表 显示没有预订的资源

Database design E保留表具有资源表中的匹配时段列。当在资源可用的时间段内进行预订时,将在列中放置一个“真值”。可用于预订的资源由找到 聚集当天每个时段的预订值 建立可用资源的列表 显示没有预订的资源,database-design,Database Design,在第三步的计算中,我们可以排除任何期间可用性为“假”的资源,然后查看保留表中的合计值,并说明如果存在保留(“真”),则可用性为“假” 下面的代码是用SQLServer2008编写的,并演示了上述主体 /****** Object: Table [dbo].[Classroom] Script Date: 05/20/2011 08:25:53 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = O

在第三步的计算中,我们可以排除任何期间可用性为“假”的资源,然后查看保留表中的合计值,并说明如果存在保留(“真”),则可用性为“假”

下面的代码是用SQLServer2008编写的,并演示了上述主体

    /****** Object:  Table [dbo].[Classroom]    Script Date: 05/20/2011 08:25:53 ******/
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Classroom]') AND type in (N'U'))
    DROP TABLE [dbo].[Classroom]
    GO
    /****** Object:  Table [dbo].[Classroom]    Script Date: 05/20/2011 08:25:53 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    SET ANSI_PADDING ON
    GO

    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Classroom]') AND type in (N'U'))
    BEGIN
    CREATE TABLE [dbo].[Classroom](
        [ClassRoomID] [int] IDENTITY(1,1) NOT NULL,
        [CrIsAvailablePeriod01] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod01 DEFAULT 0,
        [CrIsAvailablePeriod02] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod02 DEFAULT 0,
        [CrIsAvailablePeriod03] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod03 DEFAULT 0,
        [CrIsAvailablePeriod04] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod04 DEFAULT 0,
        [CrIsAvailablePeriod05] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod05 DEFAULT 0,
        [CrIsAvailablePeriod06] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod06 DEFAULT 0,
        [CrIsAvailablePeriod07] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod07 DEFAULT 0,
        [CrIsAvailablePeriod08] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod08 DEFAULT 0,
        [CrIsAvailablePeriod09] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod09 DEFAULT 0,
        [CrIsAvailablePeriod10] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod10 DEFAULT 0,
        [CrIsAvailablePeriod11] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod11 DEFAULT 0,
        [CrIsAvailablePeriod12] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod12 DEFAULT 0,
        [CrIsAvailablePeriod13] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod13 DEFAULT 0,
        [CrIsAvailablePeriod14] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod14 DEFAULT 0,
        [CrIsAvailablePeriod15] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod15 DEFAULT 0,
        [CrIsAvailablePeriod16] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod16 DEFAULT 0,
        [CrIsAvailablePeriod17] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod17 DEFAULT 0,
        [CrIsAvailablePeriod18] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod18 DEFAULT 0,
        [CrIsAvailablePeriod19] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod19 DEFAULT 0,
        [CrIsAvailablePeriod20] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod20 DEFAULT 0,
        [CrIsAvailablePeriod21] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod21 DEFAULT 0,
        [CrIsAvailablePeriod22] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod22 DEFAULT 0,
        [CrIsAvailablePeriod23] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod23 DEFAULT 0,
        [CrIsAvailablePeriod24] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod24 DEFAULT 0,
        [CrShortName] [char](10) NOT NULL,
        [CrLongName] [varchar](128) NULL,

     CONSTRAINT [PK_Classroom] PRIMARY KEY CLUSTERED 
    (
        [ClassRoomID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    END
    GO

    SET ANSI_PADDING ON
    GO


    INSERT INTO [deleteme].[dbo].[Classroom]
               ([CrIsAvailablePeriod01]
               ,[CrIsAvailablePeriod02]
              ,[CrShortName])
         VALUES
               (0,0,'A1')
               ,(0,1,'B1')
               ,(1,0,'C1')
               ,(1,1,'D1')
    GO
USE [deleteme]
GO

IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Reservation_Classroom]') AND parent_object_id = OBJECT_ID(N'[dbo].[Reservation]'))
ALTER TABLE [dbo].[Reservation] DROP CONSTRAINT [FK_Reservation_Classroom]
GO

USE [deleteme]
GO

/****** Object:  Table [dbo].[Reservation]    Script Date: 05/20/2011 08:29:59 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Reservation]') AND type in (N'U'))
DROP TABLE [dbo].[Reservation]
GO

USE [deleteme]
GO

/****** Object:  Table [dbo].[Reservation]    Script Date: 05/20/2011 08:29:59 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Reservation]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Reservation](
    [ReservationId] [int] Identity (1,1)NOT NULL,
    [ResClassroomID] [int] NOT NULL,
    [ResDate] [date] NOT NULL,
    [ResIsReservedPeriod01] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod01 DEFAULT 0, 
    [ResIsReservedPeriod02] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod02 DEFAULT 0, 
    [ResIsReservedPeriod03] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod03 DEFAULT 0, 
    [ResIsReservedPeriod04] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod04 DEFAULT 0, 
    [ResIsReservedPeriod05] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod05 DEFAULT 0, 
    [ResIsReservedPeriod06] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod06 DEFAULT 0, 
    [ResIsReservedPeriod07] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod07 DEFAULT 0, 
    [ResIsReservedPeriod08] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod08 DEFAULT 0, 
    [ResIsReservedPeriod09] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod09 DEFAULT 0, 
    [ResIsReservedPeriod10] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod10 DEFAULT 0, 
    [ResIsReservedPeriod11] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod11 DEFAULT 0, 
    [ResIsReservedPeriod12] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod12 DEFAULT 0, 
    [ResIsReservedPeriod13] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod13 DEFAULT 0, 
    [ResIsReservedPeriod14] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod14 DEFAULT 0, 
    [ResIsReservedPeriod15] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod15 DEFAULT 0, 
    [ResIsReservedPeriod16] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod16 DEFAULT 0, 
    [ResIsReservedPeriod17] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod17 DEFAULT 0, 
    [ResIsReservedPeriod18] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod18 DEFAULT 0, 
    [ResIsReservedPeriod19] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod19 DEFAULT 0, 
    [ResIsReservedPeriod20] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod20 DEFAULT 0, 
    [ResIsReservedPeriod21] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod21 DEFAULT 0, 
    [ResIsReservedPeriod22] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod22 DEFAULT 0, 
    [ResIsReservedPeriod23] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod23 DEFAULT 0, 
    [ResIsReservedPeriod24] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod24 DEFAULT 0, 

    CONSTRAINT [PK_Reservation] PRIMARY KEY CLUSTERED 
(
    [ReservationId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Reservation_Classroom]') AND parent_object_id = OBJECT_ID(N'[dbo].[Reservation]'))
ALTER TABLE [dbo].[Reservation]  WITH CHECK ADD  CONSTRAINT [FK_Reservation_Classroom] FOREIGN KEY([ResClassroomID])
REFERENCES [dbo].[Classroom] ([ClassRoomID])
GO

IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Reservation_Classroom]') AND parent_object_id = OBJECT_ID(N'[dbo].[Reservation]'))
ALTER TABLE [dbo].[Reservation] CHECK CONSTRAINT [FK_Reservation_Classroom]
GO


INSERT INTO [deleteme].[dbo].[Reservation]
           ([ResClassroomID]
           ,[ResDate]
           ,[ResIsReservedPeriod01]
           ,[ResIsReservedPeriod02])
     VALUES
           (1,'06-02-2011',1,0)
           ,(1,'06-02-2011',0,1)
           ,(2,'06-03-2011',1,1)
           ,(4,'06-03-2011',0,1)


GO
下面的代码将返回三个结果集。第一组是可用性计算,第二组是教室表列表,最后是预订表

declare @when date
set @when = '06-03-2011'


;With CTE_Res AS
(
SELECT     
Reservation.ResClassroomID AS 'ResClassroomID'
,ResDate as 'ResDate'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod01] as int)),0)as BIT) AS'IsReserved01'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod02] as int)),0)as BIT) AS'IsReserved02'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod03] as int)),0)as BIT) AS'IsReserved03'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod04] as int)),0)as BIT) AS'IsReserved04'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod05] as int)),0)as BIT) AS'IsReserved05'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod06] as int)),0)as BIT) AS'IsReserved06'
FROM         
Reservation 
WHERE ResDate = @when --'2011-06-03'
GROUP BY Reservation.ResClassroomID, ResDate
)
--Select * from CTE_RES
SELECT     
Classroom.ClassRoomID
,Classroom.CrShortName

, CASE Classroom.CrIsAvailablePeriod01 
    WHEN 0 then 0
    Else  1 ^ ISNULL(CTE_Res.IsReserved01,0) 
    END As 'IsOpenPeriod01'
, CASE Classroom.CrIsAvailablePeriod02 
    WHEN 0 then 0
    Else  1 ^ ISNULL(CTE_Res.IsReserved02,0) 
    END As 'IsOpenPeriod02'

--, CTE_Res.ResDate
, @when as [Day]
FROM         
Classroom 
LEFT OUTER JOIN CTE_Res 
ON Classroom.ClassRoomID = CTE_Res.ResClassroomID
--WHERE ResDate = '2011-06-03'



SELECT  [ClassRoomID]
,[CrShortName]
      ,[CrIsAvailablePeriod01]
      ,[CrIsAvailablePeriod02]

  FROM [deleteme].[dbo].[Classroom]

SELECT TOP 200 [ResClassroomID]
,ResDate
      ,[ResIsReservedPeriod01]
      ,[ResIsReservedPeriod02]
      ,[ResDate]  
      FROM [deleteme].[dbo].[Reservation]  

      WHERE ResDate = @when --'2011-06-03'

您的解决方案是基本预订系统。在预订系统中,资源定义为可用期。如果业务规则是以单小时增量使用资源,那么我将设计一个资源表,其中包含24个周期来表示一天中的每一小时。如果业务规则规定资源在上午8点到上午10点期间可用,我会在表示该时间范围的时段列中放置一个“真值”。在一个单独的表中跟踪保留,并将外键返回到资源。保留表具有资源表中的匹配时段列。当在资源可用的时间段内进行预订时,将在列中放置一个“真值”。可用于预订的资源由找到

  • 聚集当天每个时段的预订值
  • 建立可用资源的列表
  • 显示没有预订的资源
  • 在第三步的计算中,我们可以排除任何期间可用性为“假”的资源,然后查看保留表中的合计值,并说明如果存在保留(“真”),则可用性为“假”

    下面的代码是用SQLServer2008编写的,并演示了上述主体

        /****** Object:  Table [dbo].[Classroom]    Script Date: 05/20/2011 08:25:53 ******/
        IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Classroom]') AND type in (N'U'))
        DROP TABLE [dbo].[Classroom]
        GO
        /****** Object:  Table [dbo].[Classroom]    Script Date: 05/20/2011 08:25:53 ******/
        SET ANSI_NULLS ON
        GO
    
        SET QUOTED_IDENTIFIER ON
        GO
    
        SET ANSI_PADDING ON
        GO
    
        IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Classroom]') AND type in (N'U'))
        BEGIN
        CREATE TABLE [dbo].[Classroom](
            [ClassRoomID] [int] IDENTITY(1,1) NOT NULL,
            [CrIsAvailablePeriod01] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod01 DEFAULT 0,
            [CrIsAvailablePeriod02] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod02 DEFAULT 0,
            [CrIsAvailablePeriod03] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod03 DEFAULT 0,
            [CrIsAvailablePeriod04] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod04 DEFAULT 0,
            [CrIsAvailablePeriod05] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod05 DEFAULT 0,
            [CrIsAvailablePeriod06] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod06 DEFAULT 0,
            [CrIsAvailablePeriod07] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod07 DEFAULT 0,
            [CrIsAvailablePeriod08] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod08 DEFAULT 0,
            [CrIsAvailablePeriod09] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod09 DEFAULT 0,
            [CrIsAvailablePeriod10] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod10 DEFAULT 0,
            [CrIsAvailablePeriod11] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod11 DEFAULT 0,
            [CrIsAvailablePeriod12] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod12 DEFAULT 0,
            [CrIsAvailablePeriod13] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod13 DEFAULT 0,
            [CrIsAvailablePeriod14] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod14 DEFAULT 0,
            [CrIsAvailablePeriod15] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod15 DEFAULT 0,
            [CrIsAvailablePeriod16] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod16 DEFAULT 0,
            [CrIsAvailablePeriod17] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod17 DEFAULT 0,
            [CrIsAvailablePeriod18] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod18 DEFAULT 0,
            [CrIsAvailablePeriod19] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod19 DEFAULT 0,
            [CrIsAvailablePeriod20] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod20 DEFAULT 0,
            [CrIsAvailablePeriod21] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod21 DEFAULT 0,
            [CrIsAvailablePeriod22] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod22 DEFAULT 0,
            [CrIsAvailablePeriod23] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod23 DEFAULT 0,
            [CrIsAvailablePeriod24] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod24 DEFAULT 0,
            [CrShortName] [char](10) NOT NULL,
            [CrLongName] [varchar](128) NULL,
    
         CONSTRAINT [PK_Classroom] PRIMARY KEY CLUSTERED 
        (
            [ClassRoomID] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        ) ON [PRIMARY]
        END
        GO
    
        SET ANSI_PADDING ON
        GO
    
    
        INSERT INTO [deleteme].[dbo].[Classroom]
                   ([CrIsAvailablePeriod01]
                   ,[CrIsAvailablePeriod02]
                  ,[CrShortName])
             VALUES
                   (0,0,'A1')
                   ,(0,1,'B1')
                   ,(1,0,'C1')
                   ,(1,1,'D1')
        GO
    USE [deleteme]
    GO
    
    IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Reservation_Classroom]') AND parent_object_id = OBJECT_ID(N'[dbo].[Reservation]'))
    ALTER TABLE [dbo].[Reservation] DROP CONSTRAINT [FK_Reservation_Classroom]
    GO
    
    USE [deleteme]
    GO
    
    /****** Object:  Table [dbo].[Reservation]    Script Date: 05/20/2011 08:29:59 ******/
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Reservation]') AND type in (N'U'))
    DROP TABLE [dbo].[Reservation]
    GO
    
    USE [deleteme]
    GO
    
    /****** Object:  Table [dbo].[Reservation]    Script Date: 05/20/2011 08:29:59 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Reservation]') AND type in (N'U'))
    BEGIN
    CREATE TABLE [dbo].[Reservation](
        [ReservationId] [int] Identity (1,1)NOT NULL,
        [ResClassroomID] [int] NOT NULL,
        [ResDate] [date] NOT NULL,
        [ResIsReservedPeriod01] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod01 DEFAULT 0, 
        [ResIsReservedPeriod02] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod02 DEFAULT 0, 
        [ResIsReservedPeriod03] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod03 DEFAULT 0, 
        [ResIsReservedPeriod04] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod04 DEFAULT 0, 
        [ResIsReservedPeriod05] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod05 DEFAULT 0, 
        [ResIsReservedPeriod06] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod06 DEFAULT 0, 
        [ResIsReservedPeriod07] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod07 DEFAULT 0, 
        [ResIsReservedPeriod08] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod08 DEFAULT 0, 
        [ResIsReservedPeriod09] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod09 DEFAULT 0, 
        [ResIsReservedPeriod10] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod10 DEFAULT 0, 
        [ResIsReservedPeriod11] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod11 DEFAULT 0, 
        [ResIsReservedPeriod12] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod12 DEFAULT 0, 
        [ResIsReservedPeriod13] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod13 DEFAULT 0, 
        [ResIsReservedPeriod14] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod14 DEFAULT 0, 
        [ResIsReservedPeriod15] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod15 DEFAULT 0, 
        [ResIsReservedPeriod16] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod16 DEFAULT 0, 
        [ResIsReservedPeriod17] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod17 DEFAULT 0, 
        [ResIsReservedPeriod18] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod18 DEFAULT 0, 
        [ResIsReservedPeriod19] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod19 DEFAULT 0, 
        [ResIsReservedPeriod20] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod20 DEFAULT 0, 
        [ResIsReservedPeriod21] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod21 DEFAULT 0, 
        [ResIsReservedPeriod22] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod22 DEFAULT 0, 
        [ResIsReservedPeriod23] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod23 DEFAULT 0, 
        [ResIsReservedPeriod24] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod24 DEFAULT 0, 
    
        CONSTRAINT [PK_Reservation] PRIMARY KEY CLUSTERED 
    (
        [ReservationId] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    END
    GO
    
    IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Reservation_Classroom]') AND parent_object_id = OBJECT_ID(N'[dbo].[Reservation]'))
    ALTER TABLE [dbo].[Reservation]  WITH CHECK ADD  CONSTRAINT [FK_Reservation_Classroom] FOREIGN KEY([ResClassroomID])
    REFERENCES [dbo].[Classroom] ([ClassRoomID])
    GO
    
    IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Reservation_Classroom]') AND parent_object_id = OBJECT_ID(N'[dbo].[Reservation]'))
    ALTER TABLE [dbo].[Reservation] CHECK CONSTRAINT [FK_Reservation_Classroom]
    GO
    
    
    INSERT INTO [deleteme].[dbo].[Reservation]
               ([ResClassroomID]
               ,[ResDate]
               ,[ResIsReservedPeriod01]
               ,[ResIsReservedPeriod02])
         VALUES
               (1,'06-02-2011',1,0)
               ,(1,'06-02-2011',0,1)
               ,(2,'06-03-2011',1,1)
               ,(4,'06-03-2011',0,1)
    
    
    GO
    
    下面的代码将返回三个结果集。第一组是可用性计算,第二组是教室表列表,最后是预订表

    declare @when date
    set @when = '06-03-2011'
    
    
    ;With CTE_Res AS
    (
    SELECT     
    Reservation.ResClassroomID AS 'ResClassroomID'
    ,ResDate as 'ResDate'
    , CAST(ISNULL(MAX(CAST([ResIsReservedPeriod01] as int)),0)as BIT) AS'IsReserved01'
    , CAST(ISNULL(MAX(CAST([ResIsReservedPeriod02] as int)),0)as BIT) AS'IsReserved02'
    , CAST(ISNULL(MAX(CAST([ResIsReservedPeriod03] as int)),0)as BIT) AS'IsReserved03'
    , CAST(ISNULL(MAX(CAST([ResIsReservedPeriod04] as int)),0)as BIT) AS'IsReserved04'
    , CAST(ISNULL(MAX(CAST([ResIsReservedPeriod05] as int)),0)as BIT) AS'IsReserved05'
    , CAST(ISNULL(MAX(CAST([ResIsReservedPeriod06] as int)),0)as BIT) AS'IsReserved06'
    FROM         
    Reservation 
    WHERE ResDate = @when --'2011-06-03'
    GROUP BY Reservation.ResClassroomID, ResDate
    )
    --Select * from CTE_RES
    SELECT     
    Classroom.ClassRoomID
    ,Classroom.CrShortName
    
    , CASE Classroom.CrIsAvailablePeriod01 
        WHEN 0 then 0
        Else  1 ^ ISNULL(CTE_Res.IsReserved01,0) 
        END As 'IsOpenPeriod01'
    , CASE Classroom.CrIsAvailablePeriod02 
        WHEN 0 then 0
        Else  1 ^ ISNULL(CTE_Res.IsReserved02,0) 
        END As 'IsOpenPeriod02'
    
    --, CTE_Res.ResDate
    , @when as [Day]
    FROM         
    Classroom 
    LEFT OUTER JOIN CTE_Res 
    ON Classroom.ClassRoomID = CTE_Res.ResClassroomID
    --WHERE ResDate = '2011-06-03'
    
    
    
    SELECT  [ClassRoomID]
    ,[CrShortName]
          ,[CrIsAvailablePeriod01]
          ,[CrIsAvailablePeriod02]
    
      FROM [deleteme].[dbo].[Classroom]
    
    SELECT TOP 200 [ResClassroomID]
    ,ResDate
          ,[ResIsReservedPeriod01]
          ,[ResIsReservedPeriod02]
          ,[ResDate]  
          FROM [deleteme].[dbo].[Reservation]  
    
          WHERE ResDate = @when --'2011-06-03'