连接多个表时列出总计数和条件计数
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
如果您查询正在建设中的酒店,我会很惊讶,
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()
。
我得到了以下 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
如果您查询正在建设中的酒店,我会很惊讶,
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()
。