SQL添加多个“;计数“;在一起

SQL添加多个“;计数“;在一起,sql,Sql,我尝试将计数相加,并输出具有最大计数的一个 问题是:展示奖牌最多的人(金牌排名=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

我尝试将计数相加,并输出具有最大计数的一个

问题是:展示奖牌最多的人(金牌排名=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

从你描述的情况来看,听起来你只需要在奖牌总数中选出“最优秀”的个人。为了做到这一点,你会写这样的东西

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子句中使用它,您会得到更好的服务。

您正在按
re.place
进行分组,这是您想要的吗?您希望根据…?:)获得结果

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


在这种情况下不需要have,只需向select中添加一个
count(re.EventID)
,并使用
max(该列)

对其进行子查询,您使用的是哪个RDBMS系统?是MSSQL服务器吗?呃,这只是一个普通的sql东西。。我正在使用sqlfire.xml文件在sqlfire中运行,并在sql中编写代码在sqlfire中运行和执行,以显示该数据库文件中的输出。。。。。如果这真的有意义的话……我想如果你只是按count(*)desc订购,并选择前1名,你将是金色的。-最好的,Davidsorry我忘了在问题中加上不允许使用Order By.抱歉那不是我想要的。。我想按名称分组。如中所述,“不允许聚合嵌套”sqlfire@Tuzki-也许JW的答案对你更有效?如果没有安装sqlfire进行测试,很难判断它将允许什么。@john Woo的回答给了我一个错误:“选择列表中的表达式无效(不包含在聚合函数或分组依据列表中)