【问题标题】:How to sum columns in sql如何对sql中的列求和
【发布时间】:2020-12-27 23:57:50
【问题描述】:

我知道这可能是基本的,但我不熟悉 SQL。 所以,我有这个查询:

select nome_equipa, 
sum(case when (resultado_visitado = resultado_visitante) and jogo.equipa_id_equipa = id_equipa or (resultado_visitante = resultado_visitado) and jogo.equipa_id_equipa1 = id_equipa  then 1 else 0 end ) as empates,
sum(case when (resultado_visitado > resultado_visitante) and jogo.equipa_id_equipa = id_equipa or (resultado_visitante > resultado_visitado) and jogo.equipa_id_equipa1 = id_equipa  then 1 else 0 end ) as vitorias,
sum(case when (resultado_visitado < resultado_visitante) and jogo.equipa_id_equipa = id_equipa or (resultado_visitante < resultado_visitado) and jogo.equipa_id_equipa1 = id_equipa  then 1 else 0 end ) as derrotas
from jogo, equipa
group by nome_equipa
order by vitorias desc;

输出这个:

所以,总和列不在我的数据库中,而是由 SQL 计算的。 这些列是团队的胜利、失败和平局的数量。现在我想显示每支球队的积分数。我认为这很容易,就像在选择中添加 (empates*1 + derrotas*0 + vitorias*3) as pontos 一样,但它不起作用。我认为这是因为我试图求和的列是计算出来的,而不是在数据库中。

有人可以帮我吗?

【问题讨论】:

    标签: sql postgresql sum


    【解决方案1】:

    试试这个:

    WITH list AS (
    select nome_equipa, 
    sum(case when (resultado_visitado = resultado_visitante) and jogo.equipa_id_equipa = id_equipa or (resultado_visitante = resultado_visitado) and jogo.equipa_id_equipa1 = id_equipa  then 1 else 0 end ) as empates,
    sum(case when (resultado_visitado > resultado_visitante) and jogo.equipa_id_equipa = id_equipa or (resultado_visitante > resultado_visitado) and jogo.equipa_id_equipa1 = id_equipa  then 1 else 0 end ) as vitorias,
    sum(case when (resultado_visitado < resultado_visitante) and jogo.equipa_id_equipa = id_equipa or (resultado_visitante < resultado_visitado) and jogo.equipa_id_equipa1 = id_equipa  then 1 else 0 end ) as derrotas
    from jogo, equipa
    group by nome_equipa
    order by vitorias desc
    )
    SELECT nome_equipa
         , empates
         , derrotas
         , vitorias
         , (empates*1 + derrotas*0 + vitorias*3) as pontos
      FROM list ;
    

    相当于sticky bit的第二个选项。

    【讨论】:

      【解决方案2】:

      我认为这很容易,就像只添加 (empates*1 + derrotas*0 + vitorias*3) as pontos

      其实就是这么简单。您只是不能在这里引用列别名,您必须重复表达式:

      ...
      -- begin expression for `empates`
      sum(CASE
            WHEN resultado_visitado = resultado_visitante
                 AND jogo.equipa_id_equipa = id_equipa
                  OR resultado_visitante = resultado_visitado
                     AND jogo.equipa_id_equipa1 = id_equipa THEN
              1
            ELSE
              0
          END)
      -- end expression for `empates`
      * 1
      + 
      <analog for the other two>
      ...
      pontos
      ...
      

      或者您再次从查询中SELECT,然后您可以通过其下一级查询的别名访问列。

      SELECT *,
             empates * 1
             + derrotas * 0
             + vitorias * 3 pontos
             FROM (<your current query>) x;
      

      【讨论】:

      • 非常感谢!你能解释一下 x 是什么意思吗?
      • 这是一个(表)别名。每个派生表(不是物理表(或视图或 mview)而是由子查询构建的“表”)都需要一个,以便可以引用它。对于“普通”表(视图、mviews),您也可以使用它,但这不是强制性的,除非您两次加入同一个表并需要解决歧义。
      猜你喜欢
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多