使用MySQL查找基于国家/地区的销售统计数据

使用MySQL查找基于国家/地区的销售统计数据,mysql,Mysql,这是我的数据集 在这里,我需要找到摩托车的全国销量以及2018年的收入。 收入按数量*价格计算。 这就是输出的外观 这是我用mysql编写的查询 select con.name as country_name , mo.name as motor_cycle_model , sum(sa.quantity*mo.price) as revenue from sales sa left join country con on (con.id=sa.countr

这是我的数据集

在这里,我需要找到摩托车的全国销量以及2018年的收入。 收入按数量*价格计算。 这就是输出的外观

这是我用mysql编写的查询

select con.name as country_name
      , mo.name as motor_cycle_model
      , sum(sa.quantity*mo.price) as revenue

from sales sa
    left join country con on (con.id=sa.country_id)
    left join motorcycle_model mo on (mo.id=sa.model_id)
 where year(sales_date) = '2018'
 group by 1,2
 order by 1
但这里的问题是,我无法获得2018年没有销售的国家。

试试:

select con.name as country_name
      , mo.name as motor_cycle_model
      , sum(sa.quantity*mo.price) as revenue

from country con
    left join sales sa on (con.id=sa.country_id)
    left join motorcycle_model mo on (mo.id=sa.model_id)
 where year(sales_date) = '2018'
 group by 1,2
 order by 1
编辑:因为,正如@草莓所评论的,上面是一个
内部连接

上面是一个
内部联接
,因为在执行
左联接
时,不应该对左联接到的表中的字段进行筛选

在这种情况下,在
sales
上进行左连接,然后由于
where yea(sales_date)=2018
,结果受到限制。这样做的结果是将所有没有销售的国家排除在结果之外

更正声明:

首先,我们选择
股票
(如我所说),然后左键连接到2018年的
销售

select 
    stock.country_name
    , stock.motor_cycle_model
    , sum(COALESCE(sa.quantity * stock.price,0)) as revenue
from    
   (select con.id as cid
      , con.name as country_name
      , mo.id as mid
      , mo.name as motor_cycle_model
      , mo.price as price
    from country con
    cross join motorcycle_model mo
   ) stock
left join sales sa on sa.model_id=stock.mid
                  and sa.country_id=stock.cid
                  and year(sa.sales_date) = 2018
group by 1,2
order by 1;
输出:

国名 摩托车模型 收入 阿尔及利亚 MOTO400 0 阿尔及利亚 YZM1000 0 多米尼加 MOTO400 250000 多米尼加 YZM1000 140000 圣多美和普林西比 MOTO400 0 圣多美和普林西比 YZM1000 560000
如果您的查询以
国家/地区
开始,并左键连接到
销售
,则所有国家/地区都将在列表中。或者
右键连接国家/地区
这是一个内部查询join@Strawberry:我编辑了答案,并试图解释为什么来自/me的原始注释是错误的…请注意,范围过滤器比函数过滤器更可取,我怀疑你的查询可以写得更简单,但是,如果它能工作的话……我猜这会更理想。。。