PostgreSQL 在选择查询中使用 CASE WHEN

Joh*_*ith 4 sql postgresql select case

我在板球数据库中有一个简单的表格,它记录了每个球员在一场比赛中的得分。这些字段是:球员的姓名,他们在特定比赛中的得分,无论他们在比赛结束时“出局”还是“未出局”。显然,玩家在表中出现的次数与他们参加过的比赛一样多

我想运行一个查询,为我提供每个玩家的平均“运行”。在板球中,这是通过将他们的总跑步次数除以他们“出局”的次数来完成的,我一直在尝试的代码是这样的:

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

这样做的想法是,对于每个玩家,它会总结他们的运行并仅除以他们“出局”的次数,而忽略“出局”的次数。此代码不起作用,因为它仍然包括它们“notout”的时间,我尝试在其中添加“ELSE 0”,但由于混合了整数和字符数据类型,因此返回错误。

更新

该查询需要将玩家在每场比赛中的跑动相加,无论他们是否出局,然后除以他们出局的次数。例如,如果一名球员的比赛如下: 1. 10 次运行,出局 2. 20 次运行,出局 3. 30 次,未出局 他们的平均值将除以他们的总运行次数 (10+20+30) = 60,除以数量他们出局的次数 (2),因此他们的平均值为 30。

可能有一个我没有意识到的明显解决方案 - 有什么建议吗?!

e_i*_*_pi 6

如果您想报告所有玩家,而不管他们是否在任何比赛中出局,那么您需要定义他们从未出局的时间值。对于下面的示例,我使用了NULL. 这样做可以确保您不会得到错误除法

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;
Run Code Online (Sandbox Code Playgroud)