SQL将多个“Count”放在一起

时间:2012-09-02 03:03:14

标签: 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 '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

2 个答案:

答案 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)从中创建子查询。