-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))

抱歉忘记添加不允许使用 ORDER BY。

表中的一些数据

竞争对手表

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

在不使用 order by 的情况下,您还有其他几个选项,尽管我忽略了 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
)

这里只是一个注释。第二种方法效率非常低,因为我们重新计算父表中每一行的最大奖牌数。如果 sqlfire 支持它,那么提前计算它,将它存储在一个变量中并在 HAVING 子句中使用它会更好。

于 2012-09-02T03:09:37.863 回答
1

您按 分组re.place,这是您想要的吗?您想要每个...的结果?:)

[编辑] 很好,现在已经解决了,你就快到了 :)

在这种情况下不需要具有,您只需将 a 添加count(re.EventID)到您的选择中并使用max(that_count_column).

于 2012-09-02T03:11:56.477 回答