使用MySQL查找基于国家/地区的销售统计数据
这是我的数据集 在这里,我需要找到摩托车的全国销量以及2018年的收入。 收入按数量*价格计算。 这就是输出的外观 这是我用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
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的原始注释是错误的…请注意,范围过滤器比函数过滤器更可取,我怀疑你的查询可以写得更简单,但是,如果它能工作的话……我猜这会更理想。。。