2016-08-29 7 views
-1

次のスキーマを持つ表があります。SQL 1つのカウント結果を別のORで割る代替ソリューション

リレーショナルデータベーススキーマ:

Hotel = hotelNo, hotelName, city 
Room = roomNo, hotelNo(FK), type, rate 
Guest = guestNo, guestName, guestAddress 
Booking = hotelNo(FK), guestNo(FK), dateFrom, dateTo, roomNo(FK) 

そのデータはこの質問に対して完全には関係ありませんが、各テーブル内のエントリがあります。

予約しているホテルが含まれていることを確認して、各ホテルの平均予約数を計算する必要があります。

私はこれがあります。

から1

select count(*) 
from booking b, hotel h 
where b.hotelNo=h.hotelNo; 

これは選択呼び出し - この選択2

select count(*) 
from hotel; 

セレクト1を呼び出すには、予約の合計数を返します。選択2はホテルの総数を返します。 select 1のcountの出力をselect 2のcountの出力で単純に分けることができたら、私は自分の答えを得るでしょう。

可能であれば、誰かがコードを手伝ってください。そうでなければ、同じ結果を達成するための別の解決法が考えられますか?

+0

? –

答えて

1

ビューを作成し、ホテルごとに部屋の数を取得するために一時を言う[あなたは、ビューで「見る」のデータは実際にはどこにも保存されていない、とその場でのテーブルから生成される。]

create view temp 
as select hotelNo,count(*) as cnt from room group by hotelNo; 

次のクエリを使用して平均値を取得します。

select booking.hotelNo,count(*)/cnt 
from booking ,temp 
where booking.hotelNo = temp.hotelNo 
group by booking.hotelNo; 

または

select booking.hotelNo,count(*)/cnt 
from booking 
INNER JOIN temp 
on booking.hotelNo = temp.hotelNo 
group by booking.hotelNo; 

これは、任意の予約を持っていないホテルが含まれていません。

2

「予約の平均数」、あなただけの2つの数値を分割したいことであれば、あなたが行うことができます:あなたが使用しているDBMS

select count(b.HotelNo)/count(distinct h.hotelNo) 
from hotel h left join 
    booking b 
    on h.hotelNo = b.hotelNo; 
+0

数学を手動で行うと、結果は2.5になります。この方法を使用すると、結果は2.8ですか?何か案は? @Dylan。 – Dylan

+0

。 。はい。 'left join'はホテルごとに「空の」予約記録を持ち込んでいました。私はちょうど一致を数えるためにコードを修正しました。 –

関連する問題