【问题标题】:Create mysql query for different day intervals为不同的天间隔创建mysql查询
【发布时间】:2019-09-12 00:16:01
【问题描述】:

我有一个包含这些字段的表。 预订日期,离开日期 客户可以预订 1 天到一年的酒店。 我需要计算某人在不同的天数内预订酒店的天数。 天间隔可以是这样的:

1-7 days
7-14 days
15-30 days
31-45 days
46-60 days
61-90 days
91-120 days
121-180 days

我可以通过此查询获得任何日期的预订计数。

select DATEDIFF( booking_date,leaving_date) as day_diff 
from hotel_booking 
group by day_diff;

但无法为如上所述的不同天数间隔创建查询。我还需要按月计算这些计数组。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以通过以下方式将这些值放在单独的中:

    select (case when booking_date < leaving_date + interval 
    7 day then '1-7 day'
                 when booking_date < leaving_date + interval 
    14 day then '7-14 day'
                 . . .
            end) as diff,
           count(*) 
    from hotel_booking 
    group by diff;
    

    【讨论】:

    • 谢谢您的回复。我还需要每月计算一次。按预订日期分组。有可能吗?
    【解决方案2】:

    您可以使用条件聚合将现有查询包装在另一个查询中,以便为您提供每个周期长度的计数:

    SELECT SUM(day_diff BETWEEN 1 AND 7) AS `1 to 7 days`,
           SUM(day_diff BETWEEN 8 AND 14) AS `8 to 14 days`,
           SUM(day_diff BETWEEN 15 AND 30) AS `15 to 30 days`,
           SUM(day_diff BETWEEN 31 AND 45) AS `31 to 45 days`,
           SUM(day_diff BETWEEN 46 AND 60) AS `46 to 60 days`,
           SUM(day_diff BETWEEN 61 AND 90) AS `61 to 90 days`,
           SUM(day_diff BETWEEN 91 AND 120) AS `91 to 120 days`,
           SUM(day_diff BETWEEN 121 AND 180) AS `121 to 180 days`
    FROM (SELECT DATEDIFF(booking_date, leaving_date) AS day_diff
          FROM hotel_booking) dd
    

    要按预订月份对值进行分组,请将查询更改为

    SELECT MONTH(booking_date) AS booking_month,
           SUM(day_diff BETWEEN 1 AND 7) AS `1 to 7 days`,
           SUM(day_diff BETWEEN 8 AND 14) AS `8 to 14 days`,
           SUM(day_diff BETWEEN 15 AND 30) AS `15 to 30 days`,
           SUM(day_diff BETWEEN 31 AND 45) AS `31 to 45 days`,
           SUM(day_diff BETWEEN 46 AND 60) AS `46 to 60 days`,
           SUM(day_diff BETWEEN 61 AND 90) AS `61 to 90 days`,
           SUM(day_diff BETWEEN 91 AND 120) AS `91 to 120 days`,
           SUM(day_diff BETWEEN 121 AND 180) AS `121 to 180 days`
    FROM (SELECT DATEDIFF(booking_date, leaving_date) AS day_diff
          FROM hotel_booking) dd
    GROUP BY booking_month
    ORDER BY booking_month
    

    【讨论】:

    • 谢谢回复。我还需要每月计算一次。按预订日期分组。有可能吗?
    • @user1791574 查看我的编辑。我认为这会做你想要的。
    【解决方案3】:

    您可以使用条件聚合:

    SELECT
        SUM(day_diff >= 1   AND day_diff <= 7)   `1-7 days`,
        SUM(day_diff >= 8   AND day_diff <= 14)  `8-14 days`,
        SUM(day_diff >= 15  AND day_diff <= 30)  `15-30 days`,
        SUM(day_diff >= 31  AND day_diff <= 45)  `31-45 days`,
        SUM(day_diff >= 46  AND day_diff <= 60)  `46-60 days`,
        SUM(day_diff >= 61  AND day_diff <= 90)  `61-90 days`,
        SUM(day_diff >= 91  AND day_diff <= 120) `91-120 days`,
        SUM(day_diff >= 121 AND day_diff <= 180) `121-180 days`
    FROM (
        SELECT DATEDIFF( booking_date,leaving_date) day_diff FROM hotel_booking 
    ) x
    

    这将为您提供一个独特的记录,其中包含按列中的持续时间计数。

    您实际上只需要聚合一次:我将聚合从原始查询移至外部查询。

    【讨论】:

    • 谢谢您的回复。我还需要每月计算一次。按预订日期分组。有可能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2021-03-02
    相关资源
    最近更新 更多