首页 > 解决方案 > 如何显示收入为 0 的行

问题描述

我有 3 个表 Country(id 和 name)、motorcycle_model(id、name、price)和 sales(model_id、country_id、quantity 和 sales_date)。问题是计算 2018 年的收入。

表值如下:-

摩托车表:

身份证名称价格

1 MOTO400 50000

2 YZM1000 70000

国家表:- ID 名称 1 多米尼克 2 阿尔及利亚 3 圣多美和普林西比

销售表:- 输入 我使用我的脚本合并了 3 个表:-

select c.name,m.name,s.quantity*m.price as revenue from 
sales s,country c, motorcycle_model m
where s.model_id=m.id and s.country_id=c.id and year(s.sales_date)='2018'
group by c.name,m.name
order by m.name ;

我得到的输出为: -myoutput

但预期输出如下:- [预期输出][5] 如何获得收入为 0 的最后 3 行

预期输出:-

多米尼克 MOTO400 250000

多米尼克 YZM10000 140000

圣多美和普林西比 YZM1000 560000

阿尔及利亚 MOTO400 0

阿尔及利亚 YZM1000 0

圣多美和普林西比 MOTO400 0

创建表格并输入值的代码是:-

create table motorcycle_model(id int,name varchar(20),price int);
create table country(id int,name varchar(20));
create table sales(model_id int,country_id int,quantity int,sales_date 
date);
insert into motorcycle_model
values(1,'MOTO400',50000);
insert into motorcycle_model
values(2,'YMZ1000',70000);
insert into country
values(1,'Dominica');
insert into country
values(2,'Algeria');
insert into country
values(3,'Sao Tome and Prinipe');
insert into sales
values(2,3,4,'2018-01-29');
insert into sales
values(2,1,2,'2018-01-19');
insert into sales
values(2,1,2,'2017-12-20');
insert into sales
values(1,2,1,'2017-12-18');
insert into sales
values(1,3,5,'2017-12-10');
insert into sales
values(1,2,5,'2017-12-17');
insert into sales
values(1,1,5,'2018-01-10');
insert into sales
values(2,3,4,'2018-01-01');
insert into sales
values(2,2,3,'2017-12-24');
insert into sales
values(2,1,4,'2017-12-14');

标签: mysqlsqlsumleft-joinwhere-clause

解决方案


如果我没听错的话,你可以cross join找到型号和国家,然后带上带有left joins 的表格。最有可能的是,您还想要sum()收入(否则有一个group by条款没有意义):

select c.name, m.name, coalesce(sum(s.quantity * m.price), 0) as revenue 
from country c
cross join motorcycle_model m
left join sales s 
    on  s.model_id = m.id 
    and s.country_id = c.id 
    and s.sales_date >= '2018-01-01'
    and s.sales_date <  '2019-01-01'
group by c.name,m.name
order by m.name;

旁注:

  • 不要使用老式的隐式连接(在from子句中使用逗号);相反,使用标准的显式连接,如上所示,它们更具可读性,并且在某种程度上更灵活(如答案所示)

  • 不将函数应用于表列的条件更有效(这与 相关year(s.sales_date)='2018'


推荐阅读