-1

カウントを合計して、最大カウントのカウントを出力しようとしています。

質問は次のとおりです。最も多くのメダルを持っている人を表示します(場所として金= 1、場所として銀= 2、場所として銅= 3)

すべてのメダルを一緒に追加し、最も多くのメダルを持っている人を表示します

以下は私が考えたコードです(明らかに機能しません)

何か案は?

Select cm.Givenname, cm.Familyname, count(*)
FROM Competitors cm JOIN Results re ON cm.competitornum = re.competitornum
WHERE re.place between '1' and '3'
group by cm.Givenname, cm.Familyname
having max (count(re.place = 1) + count(re.place = 2) + count(re.place = 3))

ORDERBYの使用が許可されていないものを追加するのを忘れて申し訳ありません。

表の一部のデータ

競合他社の表

Competitornum   GivenName   Familyname  gender  Dateofbirth Countrycode
219153          Imri        Daniel      Male    1988-02-02  Aus

結果表

Eventid Competitornum   Place   Lane    Elapsedtime
SWM111  219153          1       2       20          02
4

2 に答える 2

1

あなたが説明したことから、あなたは総メダル数の「トップ」の個人をとる必要があるように思えます。それをするために、あなたはこのような何かを書くでしょう。

Select top 1 cm.Givenname, cm.Familyname, count(*)
FROM Competitors cm JOIN Results re ON cm.competitornum = re.competitornum
WHERE re.place between '1' and '3'
group by cm.Givenname, cm.Familyname
order by count(*) desc

順序を使用せずに、他のいくつかのオプションがありますが、sqlfireが使用する可能性のある構文の特殊性について詳しく説明しています。

任意のユーザーの最大メダル数を決定し、その数を持つ競合他社のみを選択することができます。これを行うには、変数に保存するか、サブクエリを使用します。

Select cm.Givenname, cm.Familyname, count(*)
FROM Competitors cm JOIN Results re ON cm.competitornum = re.competitornum
WHERE re.place between '1' and '3'
group by cm.Givenname, cm.Familyname
having count(*) = (    
    Select max( count(*) )
    FROM Competitors cm JOIN Results re ON cm.competitornum = re.competitornum
    WHERE re.place between '1' and '3'
    group by cm.Givenname, cm.Familyname
)

ここに注意してください。この2番目の方法は、親テーブルのすべての行の最大メダル数を再計算するため、非常に非効率的です。sqlfireがそれをサポートしている場合は、これを事前に計算し、変数に格納して、HAVING句で使用することで、はるかに優れたサービスを提供できます。

于 2012-09-02T03:09:37.863 に答える
1

あなたはでグループ化しre.placeています、それはあなたが望むものですか?あなたは...ごとの結果が欲しいですか?:)

[編集]よし、これで修正されたので、もうすぐそこにいます:)

この場合、持つ必要はありませんcount(re.EventID)。選択にaを追加し、それからサブクエリを作成する必要がありますmax(that_count_column)

于 2012-09-02T03:11:56.477 に答える