我有一张有三个云层的桌子(tipo,ok,ko).我正在try 找到一种基于条件求和的方法,例如在下表中使用T-SQL

Tipo KO OK Totale
act-act 28 477 505
disktier 15 7665 Null
scopertura 105 475 580
Silver100% 21 3141 3162
Silverless50% 82 7665 Null
Silvermore50% 130 7665 Null
tra 2 siti 65 7665 Null

对于每一行,我try 将Ko+ok的和放在一起,但对于和行,我想要将它们的所有Ko与相互ok相加,因此,在最后,我需要为所有4个空值计算7,957,因此Ko1(15)+Ko2(82)+K03(130)+Ko4(65)+相互ok(7665),因此期望的结果应如下表所示.

Tipo KO OK Totale
act-act 28 477 505
disktier 15 7665 7957
scopertura 105 475 580
Silver100% 21 3141 3162
Silverless50% 82 7665 7957
Silvermore50% 130 7665 7957
tra 2 siti 65 7665 7957

下面是我正在使用的代码,但它只是对第一个 case 的两列求和,我需要修改它以获得第二个 case ,并在第二个表中获得所需的结果

select TIPO, KO, OK,
       sum(case when tipo in('act-act','scopertura','Silver100%') then (ko+ok)
                else null
           end ) as totale
From table
group by tipo , ok , ko 

推荐答案

您可以使用窗口函数而不是子查询来计算总计数,从而避免了额外的(和不必要的)表扫描:

select t.*,
    case 
        when tipo in ('act-act','scopertura','Silver100%') 
            then ko + ok 
            else ok + sum(case when tipo not in ('act-act','scopertura','Silver100%') then ko else 0 end) over() 
    end totale
from mytable t

sum(...) over()表达式对整个表中给定tipoko进行窗口求和.

如果您不想重复自己,可以首先在子查询中设置标志tipo,然后在外部查询中使用它:

select t.*,
    case 
        when flag_tipo = 1 
            then ko + ok 
            else ok + sum(case when flag_tipo = 0 then ko else 0 end) over() 
    end totale
from (
    select t.*, 
        case when tipo in ('act-act','scopertura','Silver100%') then 1 else 0 end as tipo_flag
    from mytable t  
) t

Sql相关问答推荐

Oracle中的分层查询

如何连接第二个表并将其内容输入到第一个表的单个字段中?

对非RUST源代码字符串使用`stringify!`,例如SQL查询

解析SQL Server中的嵌套JSON

OVER子句WITH PARTITION BY和ORDER BY忽略主查询的WHERE子句

查找表中特定值的上次更新日期

PostgreSQL:按小时查看调整日期

是否可以为表中的所有列生成散列值?

Pgsql-返回包含多行数据的行

重用传递给 node 的参数-postgres upsert查询

SQL数据库规范化与数据插入

从重复值中获取最新值

根据时间值提取记录

当 ansible 变量未定义或为空时,跳过 sql.j2 模板中的 DELETE FROM 查询

SQL根据另一列的顺序和值获取组中的最后一列

如何从postgresql中的项目映射(关联数组)设置值?

SQL Server - 复杂场景 - 比较状态并填充值到后续行

根据是否存在值组合分组并 Select 行

我需要遍历权重值表并确定每个权重是否有效

如何在 SQL Server 中参数化 Select top 'n'