需要T-SQL查询帮助

时间:2011-05-31 10:20:12

标签: sql tsql sql-server-2008

所有

希望这有意义,但如果没有,我可以详细说明。

我有一个数据库,它是事件预订系统的后端。

定义了5个表,其中3个用于事件数据,其中2个用于预订。表格定义如下......

CREATE TABLE Events
(
    EventID INT IDENTITY(1,1) NOT NULL,
    Name NVARCHAR(50) NULL,
    IsActive BIT NOT NULL,
    Notes NTEXT NULL
)

CREATE TABLE EventDates
(
    EventDateID INT IDENTITY(1,1) NOT NULL,
    EventID INT NOT NULL,
    EventDate DATE NULL,
    Notes NTEXT NULL
)

CREATE TABLE EventDateTimes
(
    EventDateTimeID INT IDENTITY(1,1) NOT NULL,
    EventDateID INT NOT NULL,
    StartTime NVARCHAR(5) NULL,
    FinishTime NVARCHAR(5) NULL,
    Cost SMALLMONEY NULL
)

上表的原因是符合以下标准。

  • 单个事件可以运行多天
  • 每个活动日都可以有多个开始时间
  • 每个活动时间可能会有不同的费用,具体取决于开始/结束时间

我的预订表定义如下......

CREATE TABLE Bookings
(
    BookingID INT IDENTITY(1,1) NOT NULL,
    CustomerID INT NOT NULL,
    EventID INT NOT NULL,
    BookingDate DATE NULL,
    AmountPaid SMALLMONEY NULL,
    Discount SMALLMONEY NULL
)

CREATE TABLE BookingDates
(
    BookingDateID INT IDENTITY(1,1) NOT NULL,
    BookingID INT NOT NULL,
    EventDateTimeID INT NOT NULL
)

每次预订都会参考整个活动,并跟踪目前为活动支付的总金额(客户可以单独或完全支付活动的每一天/每个时间)以及适用于整体的折扣活动(根据预订的天数)。

我真正感到困惑的是试图确定某些日期之间预订的支付金额。很可能我的桌面布局是完整的,完全是垃圾,并且有更好的方法来实现我想要做的事情。或者我过于复杂的事情。

例如,我想查找2011年5月1日至2011年5月31日期间所有预订的总金额。

我想我可能有左,右和内心加入我自己的混乱。

请有人提供一些建议。 提前致谢, 千电子伏

2 个答案:

答案 0 :(得分:0)

  

我想找到支付的总金额   对于2011年5月1日之间的所有预订   和2011年5月31日。

declare @FromDate date = '2011-05-01'
declare @ToDate date = '2011-05-31'

select sum(AmountPaid) as SumAmountPaid
from Bookings
where BookingDate between @FromDate and @ToDate

或者如果你想使用EventDates.EventDate:

select sum(B.AmountPaid) as SumAmountPaid
from Bookings as B
  inner join BookingDates as BD
    on B.BookingID = BD.BookingID
  inner join EventDateTimes as EDT
    on BD.EventDateTimeID = EDT.EventDateTimeID
  inner join EventDates as ED
    on ED.EventDateID = ED.EventDateID
where ED.EventDate between @FromDate and @ToDate

答案 1 :(得分:0)

  

单个事件可以运行多个   这些活动日的每一天都可以   每个都有多个开始时间   活动时间可能有不同的成本,   取决于开始/结束时间

您需要一个EVENTS原型表,其列描述事件的与时间无关的常量功能。

EVENTS
eventid
title   
etc

您需要EVENTSINSTANCES表来定义事件的各个事件,并使用特定于时间和时间的数据。

EVENTINSTANCES
eventid
eventinstanceid
startDateTime
endDateTime
venue
fullEventDiscountPrice  

您的EVENTINSTANCES表应使用日期时间类型来跟踪startTime和finishTime。通过这种方式,您可以在周五晚上的晚上7点开始,周日下午4点结束。该表可以包含整个活动的费用/入场价格,如果它的费用不同于单独预订日期的费用,例如折扣。

从EVENTINSTANCES表中,您可以使用触发器或过程填充EVENTDAYS表。如果事件实例在星期五晚上7点开始并在星期日下午4点结束,则EVENTDAYS表将包含星期五,星期六和星期日的条目:

EVENTDAYS
eventdayid
eventinstanceid
eventDate  (datetime)
dailyFee  (money)  

为了适应整个预订活动与每日预订活动之间的价格差异,我可能会使用两个预订表:

 EVENTINSTANCEBOOKINGS (which points back to EVENTINSTANCES)

 and

 EVENTDAYBOOKINGS (which points back to EVENTDAYS)

你可以根据这两个表加入UNION,以获得预订的综合视图;或者你可以在EVENTINSTANCEBOOKINGS上放置一个触发器/程序来填充EVENTDAYBOOKINGS,类似于从EVENTINSTANCES填充EVENTDAYS的方式。因此,例如,如果有人要完整地预订周五至周日活动,EVENTDAYBOOKINGS将填充三个预订记录,每个记录都有一个按比例的金钱列(EventPrice / 3 [事件中的天数])。

这种结构可以大大简化那些给你带来麻烦的查询 - 在两个任意日期之间计算事件预订的总金额。粒度实体EVENTDAYS和EVENTDAYBOOKING消除了查询EVENTINSTANCES和EVENTINSTANCEBOOKINGS时出现的日期范围复杂性。但是,没有免费的午餐 - 虽然这个查询及其类似之处变得更简单,但插入/更新会附加程序/触发器。