SQL查询帮助

时间:2011-05-02 02:13:30

标签: sql

我有这个架构:

Hotel (**hotelNo**, hotelName, city)
Room (**roomNo, hotelNo**, type, price)
Booking (**hotelNo, guestNo, dateFrom**, dateTo, roomNo)
Guest (**guestNo**, guestName, guestAddress)
** denotes primary keys

我必须完成此查询:

  • 显示每家酒店及其最常见的房间。

我有这个查询,这不太正确:

SELECT r.hotelno, type, count(*)
FROM Hotel h, room r
WHERE h.hotelNo = r.hotelno
GROUP BY r.hotelNo, type;

这是它输出的内容:

enter image description here

我做错了什么?

3 个答案:

答案 0 :(得分:1)

如果您正在寻找受欢迎程度,则需要考虑预订表。将Booking表添加到FROM语句,在hotelNo和roomNo上链接,并对Booking表进行计数。这应该给你你想要的计数。

编辑: 以下是一些示例代码(已测试):

SELECT TOP (100) PERCENT dbo.Hotel.hotelName, dbo.Room.type, COUNT(*) AS Count
FROM dbo.Booking INNER JOIN
dbo.Room ON dbo.Booking.roomNo = dbo.Room.roomNo AND dbo.Booking.hotelNo = dbo.Room.hotelNo 
INNER JOIN dbo.Hotel ON dbo.Room.hotelNo = dbo.Hotel.hotelNo
GROUP BY dbo.Hotel.hotelName, dbo.Room.type
ORDER BY Count DESC

答案 1 :(得分:1)

看起来您正在寻找每个酒店特定类型客房预订数量最多的房间类型 - 另一个合计(房间类型预订数量)的总计(最大)。

逐步建立起来。每家酒店每种类型客房的预订数量:

SELECT r.hotelno, r.type, count(*) AS num_bookings
  FROM Booking AS b
  JOIN Room AS r ON b.hotelNo = r.hotelno AND b.roomNo = r.roomNo
 GROUP BY r.hotelNo, r.type;

现在,您需要知道每个酒店的房型最多。这必须分两个阶段完成:

  1. 查找酒店任何类型的最大预订数量。
  2. 查找具有该最大数量的房间类型。
  3. 第一阶段是:

    SELECT s.hotelno, MAX(num_bookings) AS max_bookings
      FROM (SELECT r.hotelno, r.type, count(*) AS num_bookings
              FROM Booking AS b
              JOIN Room AS r ON b.hotelNo = r.hotelno AND b.roomNo = r.roomNo
             GROUP BY r.hotelNo, r.type
           ) AS s
     GROUP BY s.hotelno;
    

    第二阶段使用以前的结果作为最终答案:

    SELECT t.hotelno, t.type
      FROM (SELECT r.hotelno, r.type, count(*) AS num_bookings
              FROM Booking AS b
              JOIN Room AS r ON b.hotelNo = r.hotelno AND b.roomNo = r.roomNo
             GROUP BY r.hotelNo, r.type) AS t
      JOIN (SELECT s.hotelno, MAX(num_bookings) AS max_bookings
              FROM (SELECT r.hotelno, r.type, count(*) AS num_bookings
                      FROM Booking AS b
                      JOIN Room AS r ON b.hotelNo = r.hotelno AND b.roomNo = r.roomNo
                     GROUP BY r.hotelNo, r.type
                   ) AS s
             GROUP BY s.hotelno) AS m
        ON t.hotelno = m.hotelno AND t.num_bookings = m.max_bookings;
    

    如果你的DBMS支持WITH子句,你可以更简洁地写出来。

答案 2 :(得分:0)

我认为你将不得不使用内部查询来使这个工作:

SELECT dbo.Hotel.hotelName, pop.type, pop.Count
FROM dbo.Hotel
    INNER JOIN (
        SELECT TOP 1 dbo.Hotel.hotelNo, dbo.Room.type, COUNT(*) AS Count
        FROM dbo.Hotel
            INNER JOIN dbo.Room ON dbo.Room.hotelNo = dbo.Hotel.hotelNo
            INNER JOIN dbo.Booking ON dbo.Booking.roomNo = dbo.Room.roomNo AND dbo.Booking.hotelNo = dbo.Hotel.hotelNo
        GROUP BY dbo.Hotel.hotelNo, dbo.Room.type
        ORDER BY Count DESC, dbo.Room.type
    ) AS pop ON pop.hotelNo = dbo.Hotel.HotelNo
ORDER BY dbo.Hotel.hotelName