Требуется справка по T-SQL Query - PullRequest
1 голос
/ 31 мая 2011

All

Надеюсь, это будет иметь смысл, но если нет, я могу подробнее рассказать.

У меня есть база данных, которая является серверной частью системы бронирования событий.

Определено 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
)

Каждое бронирование имеет ссылку на общее событие и отслеживает общую сумму, уплаченную на данный момент за событие (клиенты могут платить за каждый день / время мероприятия отдельно или в целом), а также скидку, которая применяется к общему количеству событие (на основе количества забронированных дней).

Что меня действительно смущает, так это попытка определить сумму, заплаченную за бронирование между определенными датами. Вполне может быть, что моя раскладка стола полная и полная ерунда и что есть гораздо лучший способ добиться того, что я пытаюсь сделать. Или я слишком много усложнил.

Например, я хочу найти общую сумму, заплаченную за все заказы в период с 1 мая 2011 г. по 31 мая 2011 г.

Я думаю, что у меня может быть ВЛЕВО, ПРАВО и ВНУТРЕННИЙ СОЕДИНЯТЬСЯ, чтобы совершить путаницу.

Пожалуйста, кто-нибудь может дать совет. Заранее спасибо, Кев

Ответы [ 2 ]

0 голосов
/ 01 июня 2011

одно событие может выполняться в течение нескольких дней, каждый из этих дней может иметь несколько времен начала, каждое из этих событий может иметь разные затраты, в зависимости от времени начала / окончания

Вынужна таблица-прототип EVENTS, столбцы которой описывают независимые от времени особенности события.

EVENTS
eventid
title   
etc

Вам нужна таблица EVENTSINSTANCES, чтобы определить отдельные случаи события с данными, зависящими от времени и от времени.

EVENTINSTANCES
eventid
eventinstanceid
startDateTime
endDateTime
venue
fullEventDiscountPrice  

В вашей таблице EVENTINSTANCES должны использоваться типы datetime для отслеживания startTime и finishTime.Таким образом, у вас может быть мероприятие, которое начинается в 19:00 в пятницу вечером и заканчивается в 16:00 в воскресенье днем.Эта таблица может содержать плату за вход / цену для всего мероприятия, если она стоит не столько, сколько будет стоить индивидуальное бронирование дней, например, скидка.

Из таблицы EVENTINSTANCES вы можете иметь триггер илиПроцедура заполнить таблицу EVENTDAYS.Если экземпляр события начинается в 19:00 в пятницу вечером и заканчивается в 16:00 в воскресенье, таблица EVENTDAYS будет содержать запись для пятницы, субботы и воскресенья:

EVENTDAYS
eventdayid
eventinstanceid
eventDate  (datetime)
dailyFee  (money)  

, чтобы учесть разницу вцена между событием, забронированным целиком, и событием, забронированным ежедневно, я бы, вероятно, использовал две таблицы бронирования:

 EVENTINSTANCEBOOKINGS (which points back to EVENTINSTANCES)

 and

 EVENTDAYBOOKINGS (which points back to EVENTDAYS)

Вы можете объединяться в UNION на основе этих двух таблиц, чтобы получитьсоставной вид бронирований;или вы можете поместить триггер / процедуру для EVENTINSTANCEBOOKINGS, которая заполняет EVENTDAYBOOKINGS, аналогично тому, как EVENTDAYS был заполнен из EVENTINSTANCES.Таким образом, например, если бы кто-то полностью зарезервировал событие пятница-воскресенье, EVENTDAYBOOKINGS заполнилось бы тремя записями о бронировании, каждая с колонкой пропорциональных денег (EventPrice / 3 [количество дней в событии]).

Эта структура значительно упростит запрос, который доставляет вам проблемы - тот, который вычисляет общую сумму денег за бронирование событий между двумя произвольными датами.Детализированные сущности EVENTDAYS и EVENTDAYBOOKING устраняют сложности в диапазоне дат, которые могут возникнуть при запросах к EVENTINSTANCES и EVENTINSTANCEBOOKINGS.Однако бесплатного обеда не существует - хотя этот запрос и его аналог упрощены, к вставкам / обновлениям прикреплены процедуры / триггеры.

0 голосов
/ 01 июня 2011

Я хочу найти сумму, выплаченную для всех заказов с 1 мая 2011 и 31 мая 2011 года.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...