予約情報を保存する予約テーブルがあります。平日の午前 10 時 30 分と午後 4 時 00 分の 2 つの異なる時間帯の予約が可能です。特定の時間帯については、最大 50 人の訪問者のみを受け入れます。
サンプルテーブルとデータの詳細を以下に示します。
サンプルデータに2012-08-23/16:30
よると、来場者数が上限に達しているため、予約をお受けできません。
次のクエリは、ユーザーがこの日付に予約できるように、カレンダーで特定の時間にブロックする必要がある日付を取得します。
SELECT
SUM(NoOfVisitors) as Total, TimeSlot, BookingDate, BookingCancelled
FROM
VisitorBooking
GROUP BY
BookingDate, TimeSlot, BookingDate, BookingCancelled
HAVING
SUM(NoOfVisitors) >= 50 AND TimeSlot = '16:30'
出力
Total TimeSlot BookingDate BookingCancelled
50 10:30 2012-08-23 0
キャンセルがあるかどうかを確認し、ブロックする必要がある日付を計算して提供するSQLクエリの作成に問題があります。いくつかのクエリを試しましたが、望ましい結果が得られません。上記のクエリを実行すると2012-07-20
、予約の 1 つがキャンセルされたため、さらに 3 人の訪問者の空きがあるにもかかわらず、ブロックされていると表示されます。
このクエリで結果が得られますが、これが正しいかどうかは完全にはわかりません
SELECT
SUM(NoOfVisitors) as Total, TimeSlot, BookingDate, BookingCancelled
FROM
VisitorBooking
GROUP BY
BookingDate, TimeSlot, BookingDate, BookingCancelled
HAVING
(SUM(NoOfVisitors) >= 50 AND TimeSlot = '16:30' )
AND (BookingCancelled = 'false')
私はこれに迷っています。この点で助けていただければ幸いです
CTE クエリを使用せずにこれを達成できるかどうかはわかりません。
CREATE TABLE Booking(
BookingID nvarchar(10) NOT NULL,
FirstName nvarchar(150) NULL,
LastName nvarchar(150) NULL,
Email nvarchar(150) NULL,
CompanyName nvarchar(200) NULL,
Country nvarchar(150) NULL,
Phone varchar(50) NULL,
NoOfVisitors int NULL,
BookingDate date NULL,
TimeSlot varchar(12) NULL,
BookedOn datetime NULL,
GUIDNo varchar(50) NULL,
BookingCancelled bit NULL,
)
サンプルデータ
BookingID FirstName LastName Email CompanyName Country Phone NoOfVisitors BookingDate TimeSlot BookedOn GUIDNo BookingCancelled
---------------------------------------------------------------------------------------------------------------------------------------------------
1900221519 Mark Tailor abc@abc.com XYZ USA 111111 45 2012-07-20 10:30 2012-06-25 XXXXX false
5600515751 Michael Brown abc@abc.com XYZ UK 111111 2 2012-07-20 10:30 2012-06-25 XXXXX false
1638934678 John Lee abc@abc.com XYZ UK 111111 3 2012-07-20 10:30 2012-06-25 XXXXX true
8852224170 Lee Wong abc@abc.com XYZ China 111111 50 2012-08-23 16:30 2012-07-15 XXXXX false