我正尝试使用以下信息创建住宿服务报告:
Number of Bookings (Easy, use the COUNT function)
Revenue Amount (Kind of easy).
Number of Room nights. (Rather Hard it seems)分为一年中的每个月。
限制 - 我目前使用PHP / MySQL创建此报告。
我将数据从预订系统中一次抽出1个月,然后使用ETL过程将其放入MySQL。
因此,当预订在本月底结束时,我有重复的记录。 (例如下面的BookingID = 9216 - 这是因为为了收入目的,我们需要将收入的百分比分成相应的月份)。
问题。 b>
我如何编写一些SQL将会:
计算按月预订到物业并将其分组的房间晚数。考虑到如果预订跨越月底,则同一月份内的房间夜数将计入该月份,并且与结帐的同一月份的房间夜数将在同一个月内计算在一起作为结帐。
起初,我使用这个:DATEDIFF(Checkout,Checkin)。
但是,这导致在一个31天的月份里有一个月有48个晚上的房间。 (因为a)它将11次预订算作1次预订,即使通过它在2个月内被分开,以及b)因为它出现了两次)。
然后,一旦我有了该声明,我需要整整一年将其重新整合到我的CrossTab SQL中。
我找到的一些资源似乎无法工作(MySql Query- Date Range within a Date Range& php mysql double date range)
下面是表格的一个例子:(有大约100,000行相似的数据)。
CREATE TABLE IF NOT EXISTS `bookingdata` (
`idBookingData` int(11) NOT NULL AUTO_INCREMENT,
`PropertyID` int(10) NOT NULL,
`Checkin` date DEFAULT NULL,
`Checkout` date DEFAULT NULL,
`Rent` decimal(10,2) DEFAULT NULL,
`BookingID` int(11) DEFAULT NULL,
PRIMARY KEY (`idBookingData`),
UNIQUE KEY `idBookingData_UNIQUE` (`idBookingData`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10472 ;
INSERT INTO `bookingdata` (`idBookingData`, `PropertyID`, `Checkin`, `Checkout`, `Rent`, `BookingID`) VALUES
(5148, 2, '2011-07-02', '2011-07-05', 1105.00, 10612),
(5149, 2, '2011-07-05', '2011-07-13', 2155.00, 10184),
(5151, 2, '2011-07-14', '2011-07-17', 1105.00, 11102),
(5153, 2, '2011-07-22', '2011-07-24', 930.00, 14256),
(5154, 2, '2011-07-24', '2011-08-04', 1832.73, 9216),
(5907, 2, '2011-07-24', '2011-08-04', 687.27, 9216),
(5910, 2, '2011-08-11', '2011-08-14', 1140.00, 13633),
(5911, 2, '2011-08-15', '2011-08-16', 380.00, 17770),
(5915, 2, '2011-08-25', '2011-08-29', 1350.00, 17719),
(5916, 2, '2011-08-30', '2011-09-01', 740.00, 16813);