select sum(b.price)
from 总订单表 a
LEFT JOIN 子订单表 b
ON a.id = b.aid
两数相加,一个字段里有值,一个字段没值,为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))就可以了