连接多个表时列出总计数和条件计数

List total and conditional counts while joining multiple tables

我得到了以下 tables:

Hotel (hotelNo, hotelName,hotelAddress)   
Room (roomNo,hotelNo, type, price)
Guest (guestNo, guestName, guestAddress)
Booking (hotelNo,guestNo,dateFrom, dateTo, roomNo)

问题是:“仍在建设中的酒店的百分比是多少?列出酒店总数,酒店数量 已完工、在建酒店数量、在建酒店占比。

对于我知道我可以这样做的酒店总数:

SELECT COUNT(Hotel.hotelNo)
FROM HOTEL;

2 家酒店正在建设中,我知道我可以检查是否使用:

SELECT COUNT(Hotel.hotelNo)
FROM HOTEL
INNER JOIN ROOM
ON ROOM.hotelNo = Hotel.hotelNo
HAVING COUNT(roomNo) = 0;

然后完成的酒店:

SELECT COUNT(Hotel.hotelNo)
FROM HOTEL
INNER JOIN ROOM
ON ROOM.hotelNo = Hotel.hotelNo
HAVING COUNT(roomNo) > 0;

虽然我不知道如何将所有这些放入一个查询中。我试过这样的事情:

SELECT COUNT(Hotel.hotelNo),
(SELECT COUNT(Hotel.hotelNo)
FROM HOTEL
LEFT JOIN ROOM
ON ROOM.hotelNo = Hotel.hotelNo
GROUP BY Room.roomNo
HAVING COUNT(roomNo) = 0) as count
FROM HOTEL;

尽管我有一个针对 Hotel.hotelNo 的分组语句,但是当添加时只为 COUNT(Hotel.hotelNo) 提供了 10 个 1 的 table,因为有 10 个酒店,然后是 10 个2 是因为所有这些条目中有 2 家酒店正在建设中。

我希望它看起来像这样:

TOTAL COMPLETED CONSTRUCTION PERCENTAGE
---------------------------------------
   10         8            2         20

我该怎么做?

您可以尝试这样的操作:

SELECT tmp.*
     , (tmp.total-tmp.complete) AS construction
     , ((1-tmp.complete/tmp.total)*100) AS percentage
FROM ( SELECT COUNT(DISTINCT h.hotelNo) AS total
            , COUNT(DISTINCT r.hotelNo) AS complete
       FROM HOTEL h 
       LEFT JOIN ROOM r ON r.hotelNo = h.hotelNo ) tmp

SQLFiddle

如果您查询正在建设中的酒店,我会很惊讶,

SELECT COUNT(Hotel.hotelNo)
FROM HOTEL
INNER JOIN ROOM
ON ROOM.hotelNo = Hotel.hotelNo
HAVING COUNT(roomNo) = 0;

实际有效。我这样说的原因是它看起来像一个应该是左连接的查询,寻找 hotelNo 的值,在 ROOM.

中没有对应的行

以下是将两个查询放在一起的方法:

SELECT COUNT(*) AS total
     , SUM(DECODE(room_cnt, 0, 0, 1)) AS completed
     , SUM(DECODE(room_cnt, 0, 1, 0)) AS construction
     , SUM(DECODE(room_cnt, 0, 1, 0))/COUNT(*) AS percentage
  FROM (
    SELECT h.hotelNo, COUNT(r.roomNo) AS room_cnt
      FROM hotel h LEFT JOIN room r
     WHERE h.hotelNo = r.hotelNo
     GROUP BY h.hotelNo
);

如果您喜欢 ANSI SQL,您可以使用 CASE 而不是 DECODE()