PostgreSQL在选择查询中使用CASE WHEN

时间:2017-08-03 23:22:51

标签: sql postgresql select case

我在板球数据库中有一个简单的表格,用于记录'运行'每个玩家在游戏中得分。这些字段包括:玩家的名字,他们在特定游戏中得分的分数,以及他们是否排除了#39; out' out' out'或者'没有出去'在比赛结束时。显然,玩家在桌面上出现的次数与他们玩过的比赛次数相同

我想运行一个查询,让我得到平均值'运行'每位玩家。在板球比赛中,这是通过他们的总跑步和仅除以他们的出场次数来完成的,我一直尝试的代码是这样的:

SELECT name,
       SUM(runs)/COUNT(CASE WHEN playerout = 'out' THEN name END)
FROM players
GROUP BY name;

这样的想法是,对于每个玩家来说,它总结他们的跑步并且只按他们出去的次数来划分,而忽略了“不要”。这段代码不起作用,因为它仍然包括它们的时间' notout'我试过添加' ELSE 0' in但由于混合了整数和字符数据类型而返回错误。

更新

查询需要在每个游戏中添加玩家的游戏,无论他们是否完成,然后除以他们外出的次数。例如,如果一个玩家匹配如下: 1.运行10次 2.运行20次 3. 30次运行,没有出局 他们的平均值是以他们的总跑数(10 + 20 + 30)= 60除以他们出去的次数(2),所以他们的平均值是30。

可能有一个明显的解决方案,我还没有意识到 - 有任何建议吗?!

2 个答案:

答案 0 :(得分:1)

如果您想报告所有玩家,无论他们是否在任何比赛中出局,那么您需要为他们从未离开的时间定义一个值。对于下面的示例,我使用了NULL。这样做可以确保您不会收到division by zero错误。

SELECT
    name,
    CASE WHEN SUM(CASE WHEN playerout = 'out' THEN 1 ELSE 0 END) = 0
        THEN NULL
        ELSE
            SUM(runs)
            /SUM(CASE WHEN playerout = 'out' THEN 1 ELSE 0 END)
    END AS runs_divided_by_dismissals
FROM players
GROUP BY name;

答案 1 :(得分:0)

您可以使用

SUM(CASE WHEN playerout = 'out' THEN 1 ELSE 0 END)