所有
希望这有意义,但如果没有,我可以详细说明。
我有一个数据库,它是事件预订系统的后端。
定义了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日期间所有预订的总金额。
我想我可能有左,右和内心加入我自己的混乱。
请有人提供一些建议。 提前致谢, 千电子伏
答案 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时出现的日期范围复杂性。但是,没有免费的午餐 - 虽然这个查询及其类似之处变得更简单,但插入/更新会附加程序/触发器。