Mysql SQL子查询,用于按星期和楼层统计有多少人退房(SQLZoo)

Mysql SQL子查询,用于按星期和楼层统计有多少人退房(SQLZoo),mysql,sql,Mysql,Sql,我正在使用一个SQLZoo,并使用MySQL。可以找到预订数据和数据库描述 每层楼退房一次。房间号的第一位数字表示 楼层–例如,201房间位于二楼。一周中的每一天 从2016年11月14日开始,显示当天有多少客人退房 楼层号。列应为天(星期一、星期二……),第1层, 二楼,三楼 这涉及到宾馆数据库: 预期结果,这并不完全正确,因为左侧列列出的是日期,而不是日期): 为了解决这个问题,我试图把它分成几个部分。现在,我想生成一个三列表,如: +------------+-----+--------

我正在使用一个SQLZoo,并使用MySQL。可以找到预订数据和数据库描述

每层楼退房一次。房间号的第一位数字表示 楼层–例如,201房间位于二楼。一周中的每一天 从2016年11月14日开始,显示当天有多少客人退房 楼层号。列应为天(星期一、星期二……),第1层, 二楼,三楼

这涉及到宾馆数据库:

预期结果,这并不完全正确,因为左侧列列出的是日期,而不是日期):

为了解决这个问题,我试图把它分成几个部分。现在,我想生成一个三列表,如:

+------------+-----+------------+
| Date       | Floor| Checkouts |
+------------+------+-----+-----+
| 2016-11-14 |   1  |     5     |
| 2016-11-14 |   2  |     3     | 
| 2016-11-14 |   3  |     4     |
|     .      |   .  |     .     |
|     .      |   .  |     .     |
|     .      |   .  |     .     |
| 2016-11-20 |   1  |     2     |
| 2016-11-20 |   2  |     2     | 
| 2016-11-20 |   3  |     2     |
+------------+------+-----+-----+
乍一看,这似乎很简单。
2016-11-14
的退房次数应为其
预订日+夜=2016-11-14
的所有住户的总数

我的做法:

SELECT     a.booking_date AS 'Date',
           LEFT(a.room_no, 1) AS 'Floor',

           /* Sum the number of checkouts on a.booking_date, using an alias: */
           (SELECT     SUM(b.occupants)
            FROM       booking b
           /* Compare b.booking_date of these occupants against a.booking_date: */
           WHERE      b.booking_date + INTERVAL nights DAY = a.booking_date) AS 'Checkouts'

FROM       booking a

/* Run through each date in the range */        
 WHERE     (a.booking_date >= '2016-11-14' AND 
            a.booking_date <= '2016-11-20')

/* Group checkouts by date and by floor */  
GROUP BY   a.booking_date, 
           LEFT(a.room_no, 1);
起初,我想知道我的
离开(a.room_no,1)
是否不起作用,这给了我一天所有楼层的退房总数。然而,根据SQLZoo的数据,
2016-11-14
(所有楼层)的退房总数为
5+3+4=12
。我得到了
18

我嵌套的
SELECT
groupby
类别背后的推理有什么问题?

选择DATEPART(WEEK,DATEADD(DAY,nights,booking\u date))作为周号\u checkout\u date,
SELECT DATEPART(WEEK, DATEADD(DAY, nights, booking_date)) AS week_number_checkout_date,
       DATENAME(WEEKDAY, DATEADD(DAY, nights, booking_date)) AS week_day_checkout_date,
       LEFT(room_no, 1) [floor],
       SUM(occupants) checkouts
  FROM booking
 WHERE booking_date >= CAST('2016-11-14' AS DATE)
   AND booking_date <= CAST('2016-11-20' AS DATE)
 GROUP BY DATEPART(WEEK, DATEADD(DAY, nights, booking_date)),
          DATENAME(WEEKDAY, DATEADD(DAY, nights, booking_date)),
          LEFT(room_no, 1)
DATENAME(工作日,DATEADD(日,夜,预订日期))作为周日结账日期, 左(1号房间)[楼层], 总(住客)结账 从预订 其中预订日期>=CAST('2016-11-14'为日期) 预订日期
选择日期部分(周、日期添加(日、夜、预订日期))作为周号、结帐日期,
DATENAME(工作日,DATEADD(日,夜,预订日期))作为周日结账日期,
左(1号房间)[楼层],
总(住客)结账
从预订
其中预订日期>=CAST('2016-11-14'为日期)

我已经解决了这个问题

  • 错误1:没有按楼层和日期分组
  • 错误2:使用
    a.booking\u date
    而不是
    (booking\u date+INTERVAL nights DAY)
解决方案:

SELECT
    (booking_date + INTERVAL nights DAY) AS Date,
    LEFT(room_no, 1) AS Floor,
    SUM(occupants) AS Checkouts
FROM booking
WHERE
    (booking_date + INTERVAL nights DAY) >= '2016-11-14' AND 
    (booking_date + INTERVAL nights DAY) <= '2016-11-20'
GROUP BY (booking_date + INTERVAL nights DAY), Floor;
选择
(预订日期+间隔天数)作为日期,
左(1号房间)为楼层,
总计(占用者)作为结帐
从预订
哪里
(预订日期+间隔天数)>='2016-11-14'和

(预订日期+休息日)我已经解决了这个问题

  • 错误1:没有按楼层和日期分组
  • 错误2:使用
    a.booking\u date
    而不是
    (booking\u date+INTERVAL nights DAY)
解决方案:

SELECT
    (booking_date + INTERVAL nights DAY) AS Date,
    LEFT(room_no, 1) AS Floor,
    SUM(occupants) AS Checkouts
FROM booking
WHERE
    (booking_date + INTERVAL nights DAY) >= '2016-11-14' AND 
    (booking_date + INTERVAL nights DAY) <= '2016-11-20'
GROUP BY (booking_date + INTERVAL nights DAY), Floor;
选择
(预订日期+间隔天数)作为日期,
左(1号房间)为楼层,
总计(占用者)作为结帐
从预订
哪里
(预订日期+间隔天数)>='2016-11-14'和

(预订日期+休息日)我很难回答您的问题,因为我不熟悉预订数据,而且您也从未将其包括在您的问题中。@TimBiegeleisen:很抱歉。我在SQLZoo的网站上加入了包含预订数据和数据库描述的网页链接。投票结束,因为不清楚你在问什么。堆栈溢出问题需要是独立的,您不应该期望任何人熟悉SQLZoo的模式。@TimBiegeleisen:明白。我发帖是因为这里还有其他类似的SQLZoo问题。我很难理解你的问题,因为我不熟悉预订数据,而且你也从来没有把它包括在你的问题中。@TimBiegeleisen:很抱歉。我在SQLZoo的网站上加入了包含预订数据和数据库描述的网页链接。投票结束,因为不清楚你在问什么。堆栈溢出问题需要是独立的,您不应该期望任何人熟悉SQLZoo的模式。@TimBiegeleisen:明白。我发帖是因为这里还有其他类似的SQLZoo问题。我不知道如何测试t-SQL,但用它来编写下面发布的MySQL版本。对于第二行,您的意思是将列checkout_day_name?DATENAME(WEEKDAY,DATEADD(day,nights,booking_date))称为week_day_checkout_date吗?我使用别名作为居住者检查的日期。您是否尝试过该代码?你还有什么问题吗?或者这解决了吗?太好了!很乐意帮忙。:)我不知道如何测试t-SQL,但用它编写了下面发布的MySQL版本。对于第二行,您的意思是将列checkout_day_name?DATENAME(WEEKDAY,DATEADD(day,nights,booking_date))称为week_day_checkout_date吗?我使用别名作为居住者检查的日期。您是否尝试过该代码?你还有什么问题吗?或者这解决了吗?太好了!很乐意帮忙。:)
SELECT
    (booking_date + INTERVAL nights DAY) AS Date,
    LEFT(room_no, 1) AS Floor,
    SUM(occupants) AS Checkouts
FROM booking
WHERE
    (booking_date + INTERVAL nights DAY) >= '2016-11-14' AND 
    (booking_date + INTERVAL nights DAY) <= '2016-11-20'
GROUP BY (booking_date + INTERVAL nights DAY), Floor;