SQL-Server查询计算每月占用率

标签 sql sql-server outsystems

我正在开发一个预订应用程序,并且正在创建一个查询来按月计算酒店的入住率。为此,我必须检查所有预订的入住和退房日期,并增加一些变量并将它们与相应的月份相关联。 我只需要测量当年的这个比率。 如果预订的退房日期或入住日期是三月(例如),我需要增加与该月的职业相对应的变量。我需要为该年间隔内的每次预订执行此操作。

Booking 有入住日期和退房日期,其他属性与此查询无关,输入参数为 BeginDate (2015-01-01 ) 和 EndDate (2015-12-31)。

Month       Ocupation
[JANUARY] | 29
[FEBRUARY] | 20
[MARCH] | 30
....... | ... 

这就是我到目前为止所做的,此刻我有点迷失了。任何帮助将不胜感激。

   Select  
        SUM(CASE WHEN datename(month, [CheckIn]) = 'January' or datename(month, [CheckOut]) = 'January' THEN 1 ELSE 0 END)  January,
        SUM(CASE WHEN datename(month, [CheckIn]) = 'February' or datename(month, [CheckOut]) = 'February' THEN 1 ELSE 0 END) February,
        SUM(CASE WHEN datename(month, [CheckIn]) = 'March' or datename(month, [CheckOut]) = 'March' THEN 1 ELSE 0 END) March,
        SUM(CASE WHEN datename(month, [CheckIn]) = 'April' or datename(month, [CheckOut]) = 'April' THEN 1 ELSE 0 END)  April,
        SUM(CASE WHEN datename(month, [CheckIn]) = 'May' or datename(month, [CheckOut]) = 'May' THEN 1 ELSE 0 END)  May,
        SUM(CASE WHEN datename(month, [CheckIn]) = 'June' or datename(month, [CheckOut]) = 'June' THEN 1 ELSE 0 END) June,
        SUM(CASE WHEN datename(month, [CheckIn]) = 'July' or datename(month, [CheckOut]) = 'July' THEN 1 ELSE 0 END) July,
        SUM(CASE WHEN datename(month, [CheckIn]) = 'August' or datename(month, [CheckOut]) = 'August' THEN 1 ELSE 0 END) August,
        SUM(CASE WHEN datename(month, [CheckIn]) = 'September' or datename(month, [CheckOut]) = 'September' THEN 1 ELSE 0 END) September,
        SUM(CASE WHEN datename(month, [CheckIn]) = 'October' or datename(month, [CheckOut]) = 'October' THEN 1 ELSE 0 END) October,
        SUM(CASE WHEN datename(month, [CheckIn]) = 'November' or datename(month, [CheckOut]) = 'November' THEN 1 ELSE 0 END) November,
        SUM(CASE WHEN datename(month, [CheckIn]) = 'December' or datename(month, [CheckOut]) = 'December' THEN 1 ELSE 0 END) December
FROM {Booking} INNER JOIN {Status} ON {Booking}.[StatusId] = {Status}.[Id]
WHERE {Booking}.[CheckIn] >= @BeginDate AND {Booking}.[CheckOut]  <= @EndDate AND {Status}.[Label] <> 'Canceled' 

最佳答案

假设您希望将同一月份发生入住和退房的预订计为该月的 1 个职业,并将不同月份发生入住和退房的预订计为每月 1 个,则此查询应该有效:

SELECT 
    Month, 
    'Occupation' = COUNT(MonthNo)
FROM Booking 
OUTER APPLY (
    SELECT MonthNo, Month FROM (
       VALUES (1, 'January'), (2, 'February'), (3, 'March'),(4, 'April'), (5, 'May')
    ) AS Months (MonthNo, Month) 
    WHERE MonthNo BETWEEN MONTH(CheckIn) AND MONTH(CheckOut)
) c
-- WHERE CheckIn >= @BeginDate 
--   AND CheckOut  <= @EndDate 
--   AND [Status].[Label] <> 'Canceled' 
GROUP BY Month, MonthNo ORDER BY MonthNo

我使用表值构造函数来制作包含内联月份数字和名称的表,但如果您已经有一个合适的日历表(您应该这样做),则可以使用它。

给定一个输入表,例如:

Id  CheckIn     CheckOut
1   2015-01-30  2015-03-31 -- 1 for Jan, Feb, Mar
2   2015-01-03  2015-01-05 -- 1 for Jan
3   2015-01-30  2015-02-05 -- 1 for Jan, Feb
4   2015-01-30  2015-01-31 -- 1 for Jan
5   2015-02-01  2015-02-03 -- 1 for Feb
6   2015-03-22  2015-04-01 -- 1 for Mar, Apr
7   2015-03-23  2015-04-03 -- 1 for Mar, Apr
8   2015-03-30  2015-03-31 -- 1 for Mar
9   2015-04-01  2015-04-03 -- 1 for Apr
10  2015-04-28  2015-05-01 -- 1 for Apr, May
11  2015-05-01  2015-05-03 -- 1 for May

它会产生如下输出:

Month   Occupation
January     4
February    3
March       4
April       4
May         2

关于SQL-Server查询计算每月占用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28963021/

相关文章:

mysql - sql 如果存在则插入,如果不存在则插入

java - 准备好的 SQL 语句无效

sql-server - 全局程序集缓存中的 Microsoft.SqlServer.Types.dll?

mysql - 高级查询未返回所需结果的问题

SQL Server 逆透视/透视示例

mysql - 我在 Google 表格上有大量数据。我会用它来练习运行 SQL 查询。我怎样才能做到这一点?

mysql - 递归 SQL 选择

sql - 如何选择我的主键?

c++ - 使用 ODB ORM 执行存储过程

outsystems - Html2PdfConverter 示例转换