sql - 有条件求和

标签 sql t-sql sum subquery case

我有一张包含三列的 table (tipo,ok,ko)。我正在尝试找到一种方法,根据使用 T-sql 的条件对值进行求和,例如下表

<表类=“s-表”> <标题> 蒂波 KO 确定 总计 <正文> 行动-行动 28 477 505 磁盘层 15 7665 空 范围 105 475 580 银100% 21 3141 3162 无银50% 82 7665 空 银摩尔50% 130 7665 空 tra 2站点 65 7665 空

对于每一行,我试图将 Ko + ok 的总和作为总计,但对于总和行,我想将相互总计,因此对于空值,我想将所有 ko 的总和与相互 ok 相加,因此在最后,我需要为所有 4 个空值设置 7,957,因此 ko1(15) + ko2(82) +ko3(130) +ko4(65) +mutual ok (7665) 因此所需的结果应如下表所示,

<表类=“s-表”> <标题> 蒂波 KO 确定 总计 <正文> 行动-行动 28 477 505 磁盘层 15 7665 7957 范围 105 475 580 银100% 21 3141 3162 无银50% 82 7665 7957 银摩尔50% 130 7665 7957 tra 2站点 65 7665 7957

这是我正在使用的代码,但它只是对第一种情况的两列求和,我需要修改它以获得第二种情况并在第二个表上获得所需的结果

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 - 有条件求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75768890/

相关文章:

mysql - 适用于超大型查询的最快 MySQL 引擎

mysql - 两个很长的 IN 或 WHERE SQL 语句,90,000 行查询?

sql - 降低查询计划中表值函数 - XML Reader 的成本 - 如何?

json - 当源未格式化为集合时使用 OPENJSON

sql - MySQL IN 运算符

mysql - 如何在单个查询中将多个总和从列旋转到行

python - 根据另一列中的特定值对一列中的值求和

php - phpmyadmin 中的外键在新闻源中给出错误

mysql - 如何为 MySQL 中的用户授予 CREATE USER 和 GRANT 权限?

sum - MDX 对一维层次结构中的所有值求和