社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL-当没有记录时将结果设为零

Rafael Francisco • 5 年前 • 1624 次点击  

create table model (
id int comment 'The model id. Primary Key',
name varchar(50) comment 'Models name',
price int comment 'The price of the model',
primary key (id)
);

create table country (
id int comment 'The country id. Primary Key',
name varchar(50) comment 'Countrys name',
primary key (id)
);

create table sales (
model_id int comment 'Models id',
country_id int comment 'Countrys id',
quantity int comment 'Number of units sold',
sales_date date comment 'Date of the sale'
);

INSERT INTO COUNTRY VALUES
(1, 'Brazil'),
(2, 'Italy'),
(3, 'China');

INSERT INTO model VALUES
(1, 'ZTX100', 100),
(2, 'AHT567', 200),
(3, 'JPF090', 300);

INSERT INTO sales VALUES
(1, '1', 500, '2017-01-10'),
(2, '2', 600, '2017-05-11'),
(3, '3', 700, '2017-07-21'),
(1, '3', 200, '2019-08-14');

我需要编写一个查询,计算所有车型的国别销售额以及2017年的收入。结果应采用以下格式:country|name| model|name| revenue

我正在尝试下面的查询。我需要把没有任何销售的国家/型号也带来,收入为0,但是我的查询只返回有任何销售的国家/型号。

SELECT c.name as country_name,
       m.name as model_name, 
       IFNULL(SUM(s.quantity * m.price),0) as revenue 
    FROM
    sales s
     right join model m on s.model_id = m.id
     right join country c on s.country_id = c.id
where date(s.sales_date) between '2017-01-01' and '2017-12-31'    
group by c.id, m.id
order by c.id, m.id;

查询结果

Brazil  ZTX100  50000
Italy   AHT567  120000
China   JPF090  210000

Brazil  ZTX100  50000
Brazil  AHT567  0
Brazil  JPF090  0

Italy   ZTX100  0
Italy   AHT567  120000
Italy   JPF090  0

China   ZTX100  0
China   AHT567  0
China   JPF090  210000

有一个简单的方法吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/54146
文章 [ 1 ]  |  最新文章 5 年前
GMB
Reply   •   1 楼
GMB    5 年前

你可以 cross join 生成所有可能组合的国家/地区和型号表,然后使用 left join :

SELECT 
    c.name as country_name,
    m.name as model_name, 
    IFNULL(SUM(s.quantity * m.price),0) as revenue 
FROM 
    country c
    cross join model m
    left join sales s
        on s.model_id = m.id
        and s.country_id = c.id
        and s.sales_date >= '2017-01-01' 
        and s.sales_date <  '2018-01-01'    
group by c.id, m.id, c.name, m.name
order by c.id, m.id;

注意,我在查询中做了以下更改:

  • sales_date

  • 将所有非聚合列添加到 group by ONLY_FULL_GROUP_BY ,默认情况下从MySQ 5.7开始启用