-1

予約、ホテル、ゲスト、部屋の4つのテーブルを持つDBがあります。各ホテルの平均宿泊料金を生成する SQL ステートメント (Oracle) を取得しようとしています。これは現在私が持っているものです:

SELECT HOTEL.H_NAME "HOTEL NAME", ROUND(AVG (R_PRICE), 1) "AVERAGE ROOM PRICE"
FROM ROOM, HOTEL
WHERE HOTEL.H_NAME = 'Shangra_La'
OR HOTEL.H_NAME = 'Hilton'
OR HOTEL.H_NAME = 'Sheraton'
GROUP BY HOTEL.H_NAME
ORDER BY HOTEL.H_NAME;

私が考えたところ、そのステートメントは「Shangra_la」、「Hilton」、「Sheraton」のすべての部屋のホテル名と平均価格を選択し、ホテルの名前で並べ替えますが、これを行うと、間違っている各ホテルの同じ平均。これは私の出力です:

H_NAME      AVG. R_PRICE
Hilton      253.5
Shangra_La  253.5
Sheraton    253.5

以下は、ROOM のテーブル データです。

insert into room values
('1','H100','S',220.00);
insert into room values
('2','H100','D',230.00);
insert into room values
('3','H100','F',310.00);
insert into room values
('1','H200','S',260.00);
insert into room values
('2','H200','D',170.00);
insert into room values
('3','H200','S',250.00);
insert into room values
('4','H200','F',180.00);
insert into room values
('5','H200','F',295.00);
insert into room values
('1','H300','D',200.00);
insert into room values
('2','H300','S',420.00);

とホテル:

insert into hotel values
('H100','Sheraton','Melbourne');
insert into hotel values
('H200','Shangra_La','Sydney');
insert into hotel values
('H300','Hilton', 'Perth');

ステートメントの構造が間違っていませんか? この問題を解決するにはどうすればよいですか? うまくいけば、私は十分な情報を提供しました。

4

4 に答える 4

2

2つのテーブルを結合する必要があります。

SELECT HOTEL.H_NAME "HOTEL NAME", ROUND(AVG (R_PRICE), 1) "AVERAGE ROOM PRICE"
FROM ROOM, HOTEL
WHERE HOTEL.H_NAME = 'Shangra_La'
OR HOTEL.H_NAME = 'Hilton'
OR HOTEL.H_NAME = 'Sheraton'
AND HOTEL.R_NUM = ROOM.R_NUM -- Here (guessing at your column names)
GROUP BY HOTEL.H_NAME
ORDER BY HOTEL.H_NAME;

編集:

SELECT H.H_NAME "HOTEL NAME", ROUND(AVG (R.R_PRICE), 1) "AVERAGE ROOM PRICE"
FROM ROOM R INNER JOIN HOTEL H ON R.HOTEL_NO = H.HOTEL_NO
WHERE H.H_NAME = 'Shangra_La'
OR H.H_NAME = 'Hilton'
OR H.H_NAME = 'Sheraton'
GROUP BY H.H_NAME
ORDER BY H.H_NAME;

それ以外の場合、表示される平均数は、すべての部屋と価格のデカルトの平均になります

于 2012-10-18T09:58:59.493 に答える
2

room結合条件がないため、との外積をとっていますhotel

SELECT HOTEL.H_NAME "HOTEL NAME", ROUND(AVG (R_PRICE), 1) "AVERAGE ROOM PRICE"
FROM ROOM JOIN HOTEL ON HOTEL.HOTEL_NO = ROOM.HOTEL_NO
WHERE HOTEL.H_NAME = 'Shangra_La'
OR HOTEL.H_NAME = 'Hilton'
OR HOTEL.H_NAME = 'Sheraton'
GROUP BY HOTEL.H_NAME
ORDER BY HOTEL.H_NAME;
于 2012-10-18T09:59:46.697 に答える
0

私はそれをテストしていませんが、最初の行は次のようになります。

HOTEL.H_NAME "HOTEL NAME", ROUND(AVG (HOTEL.R_PRICE), 1)

ホテル固有の価格ではなく、すべての価格を平均していると思います 。

于 2012-10-18T10:01:11.770 に答える
0

クエリには重要な情報が 1 つ欠けています:hotelとの間のリンクroomです。H100データベースはそれがホテルであることを知りません。あなたは言わなければなりません。これは「結合」と呼ばれます (特定の方法で 2 つのセットを結合するため)。

句に追加AND ROOM.R_HOTEL_ID = HOTEL.H_IDWHEREます(正しい列名を使用する必要がありますが、アイデアは得られます)。

于 2012-10-18T10:01:48.710 に答える