我正在尝试将计数加在一起并输出具有最大计数的计数。
问题是:显示奖牌最多的人(黄金作为地方= 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
答案 0 :(得分: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
)
这里只是一个注释。第二种方法非常低效,因为我们重新计算父表中每一行的最大奖牌数。如果sqlfire支持它,那么通过提前计算,将它存储在变量中并在HAVING子句中使用它,可以更好地服务。
答案 1 :(得分:1)
您按re.place
进行分组,这是您想要的吗?你想要每个结果......? :)
[编辑]很好,现在这已经解决了你几乎在那里:)
在这种情况下不需要使用,您只需要在选择中添加count(re.EventID)
并使用max(that_count_column)
从中创建子查询。