私のデータベースを含むCOUNTのAVGを含むクエリとクエリはそうのようになります。SQLクエリの日付
PEAK(NAME、ELEV、DIFF、MAP、REGION)
CLIMBER(NAME、SEX)
は(TRIP_ID、NAME)
登っ(TRIP_ID、PEAK)
-
に参加しました210
- PEAKは、ユーザーが興味を持っている山のピークに関する情報を表示します。表には、各ピークの名前、標高(フィート単位)、難易度(1-5のスケール)、マップその上に位置するシエラネバダの地域にあります。
- CLIMBERはクラブのメンバーを列挙し、その氏名と性別を示しています。
- 参加者は、さまざまな登山旅行のそれぞれに参加した登山者の集合を提供します。各旅行の参加者の数は様々です。
- CLIMBEDは、各ピークが登ったデータに沿って、各登山旅行でどのピークが登ったかを示します。
私はこれら2例のシナリオのためのSQLクエリを書く/ wの助けを必要とする:
- クラブの男性で、クラブの女性でスケーリングピークの平均数を計算します。
- マリアが登ったひとつひとつのピークをどんな人が登っていますか?
- 60日間のピーク期間に20以上のピークに達したのは誰ですか?
EDIT:まずクエリが機能するようになりましたし、次のようになります。
SELECT SEX, AVG(num_peaks) AS avg_peaks
FROM
(
SELECT CLIMBER.*, COUNT(CLIMBED.PEAK) num_peaks
FROM CLIMBED
INNER JOIN PARTICIPATED
ON PARTICIPATED.TRIP_ID = CLIMBED.TRIP_ID
RIGHT OUTER JOIN CLIMBER
ON CLIMBER.NAME = PARTICIPATED.NAME
GROUP BY CLIMBER.NAME, CLIMBER.SEX
)
GROUP BY SEX;
このクエリでは、ピークの全体数は、私の男性を登った私を与え、メス。しかし、私はカウントの代わりに平均を得る方法を理解しているように見えることはできません。私はあなたが単にAVG b/cにCOUNT機能を変更することはできません知っている私のデータは整数ではなく文字列形式です。
私の2番目のクエリはそうのようになります。
SELECT DISTINCT PARTICIPATED.NAME
FROM PARTICIPATED
INNER JOIN CLIMBED
ON PARTICIPATED.TRIP_ID = CLIMBED.TRIP_ID
WHERE CLIMBED.PEAK IN
(
SELECT CLIMBED.PEAK
FROM CLIMBED
INNER JOIN PARTICIPATED
ON PARTICIPATED.TRIP_ID = CLIMBED.TRIP_ID
WHERE NAME IN ('MARIA')
)
AND PARTICIPATED.NAME NOT IN ('MARIA');
クエリは私にマリアも登ったピークを登ってきた人たちのすべてを与えるが、私にを登ってきたばかりの人を与えるものではありませんすべてマリアが登った単一のピーク。この方法で残りの人をフィルタリングする方法がわからない。
そして最後に、私の最後のクエリはそうのようになります。
SELECT PARTICIPATED.NAME, COUNT(DISTINCT CLIMBED.PEAK)
FROM PARTICIPATED
LEFT JOIN CLIMBED
ON CLIMBED.TRIP_ID = PARTICIPATED.TRIP_ID
GROUP BY PARTICIPATED.NAME;
このクエリは、登山者の名前と彼らはそれぞれが登っていたピークの合計数のすべてを与えますが、私はそれをフィルタリングする方法について見当もつかない60日以内に20以上のピークを登った人のみが表示されます。 私は使用しようとしました
HAVING CLIMBED.WHEN BETWEEN -60 AND 60;
しかし、それは動作しません。
ご協力いただきありがとうございます。私はOracle Expressをデータベースとして使用しています。
あなたは既にこの質問を投稿しています[こちら](http://stackoverflow.com/questions/36437653/sql-query-average-climbed-and-pair-that-has-climbed-themost-peaks) – MT0
あなたの全体の質問に対する回答ではありません。しかし、2番目のクエリは 'WHERE CLIMBED.PEAK = ALL(... WHERE NAME = 'MARIA')と名前<> 'MARIA' 'を持つ必要があります。 'IN'を使うのは= ANY(...)と同じですが、1つではなく、すべてのピークが必要です。また、単一の値にINを使用するのは無意味ですが、代わりに=と<>を使用してください。あなたにはセミコロンが余分にあります。 [この記事ORACLEとANY、ALL、およびSOME](https://oracle-base.com/articles/misc/all-any-some-comparison-conditions-in-sql)を参照してください。 –