2011-05-02 103 views
1

我有这样的模式: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

我在做什么错?

回答

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. 找到最大号码的房间类型。

第一阶段是:

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子句支持,你可以写更多简洁。

1

如果您正在寻找知名度,您需要考虑预订表。将预订表添加到您的FROM语句中,链接到hotelNo和roomNo并在预订表中进行计数。这应该给你你想要的数量。

编辑: 这是给你一些示例代码(测试):

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 
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