sql计算总金额的问题

最近项目有个sql问题(数据库是oracle),类似于大订单计算总金额,大订单下小订单只要有一个价格是null的话,那么大订单的总金额就是null
模拟写个sql,下面这个sql求总订单的总金额,我这边需求是如果 关联的子订单表中有个价格是null,那么sum()的总金额就是null,不管其他订单有没有价格,只要存在一个为null的总金额就是null

select sum(b.price)
from 总订单表 a
LEFT JOIN 子订单表 b
ON a.id = b.aid

希望大家有知道这种sql怎么写的麻烦回复一下,给我提供一下思路,谢谢大家

两数相加,一个字段里有值,一个字段没值,为null,二者相加的结果为null。
在SQL的语法中,数值+null=null,而不是数值+null=数值本身。

那你不能直接sum呀,sum总能sum出一个值来
你需要写个子查询,判断一下里面是否有null值,如果有null值返回null,没有才返回sum

select sum(nvl(b.price,0))
from 总订单表 a
LEFT JOIN 子订单表 b
ON a.id = b.aid

写的sql不就满足了么

根据您的需求,搞了一个demo,可以满足需求。
其它:
1、如果子订单一定存在的话,要用inner join,别用left join,具体原因,您可以看看mysql相关书籍;
2、这种需求我个人建议在业务代码里面比较好,后续也好扩展,仅供参考。


create table test_A
(
    id varchar(32) not null comment 'id'
        primary key
);

create table test_B
(
    id        varchar(32) not null comment 'id'
        primary key,
    test_a_id varchar(32) not null comment 'test_a_id',
    price     decimal     null comment '金额'
);

select
       if(priceIsNullNum > 0,null,totalPrices) result #如果价格为空的子订单个数 >0,返回null,反之返回totalPrices
from (
select
       sum(price) totalPrices,#累加金额
       sum(IF(b.price is null, 1, 0)) priceIsNullNum #统计价格为空的子订单个数
from test_A a inner join test_B b on a.id = b.test_a_id) c

你好oracle的语法好像编译不通过哎,就sum(IF(b.price is null, 1, 0)) priceIsNullNum #统计价格为空的子订单个数
这句,> ORA-00907: missing right parenthesis

mysql里面有个这样的语法
case when price=null then 0
else price end
你可以查一下oracle里面有没有类似的语法。语义接近if else

oracle里自带一个函数nvl,可以将NULL值直接转换为0,运用到本次需求里,只需要将sum(b.price)修改为sum(nvl(b.price,0))就可以了