我有2个表:“ prueba”是包含所有产品描述和代码的目录。
Field Type Null Key Default Extra
cod varchar(10) NO PRI
nom varchar(100) NO
tip varchar(50) NO
des varchar(500) NO
pre double NO
can int(11) YES 1
cla varchar(3) NO
fcm varchar(20) YES
cmb char(1) NO 0
而“ venta”包含销售:
Field Type Null Key Default Extra
id int(255) NO PRI auto_increment
can int(11) NO
tot double NO
fec varchar(30) NO
hor varchar(20) NO
cod_f varchar(10) YES MUL
per_f varchar(30) YES MUL
tdt varchar(15) NO
des double YES
com varchar(500) YES
cdv varchar(15) NO
cliente varchar(100) YES
fdc varchar(30) YES
local varchar(25) NO
trans varchar(10) YES
我需要做一个报告,显示在某些商店出售了多少特定代码。因此,在“ venta”中,cod_f是代码,can是已售数量,tdt表示交易的类型,local是交易的地点。因此,如果交易是出售,则tdt ='V'。以下查询仅向我显示在该商店上进行的交易的代码。
select prueba.cod, ifnull(sum(venta.can),0)
from venta, prueba
where
venta.cod_f = prueba.cod and
tdt = 'V' and
local = 'XCSUR' and
yearweek( DATE_FORMAT(STR_TO_DATE(fec, '%d/%m/%Y'), '%Y-%m-%d') ) between yearweek(curdate() - interval 8 week) and yearweek(curdate())
group by cod_f
order by CHAR_LENGTH(cod_f), cod_f;
我想要的是甚至显示不属于销售的代码,将它们显示为0,F / E:
我的查询显示:
2010 1
2012 5
2013 2
2022 1
并省略了中间代码。我想要的是这样的:
2010 1
2011 0
2012 5
2013 2
2014 0
2022 1
提前致谢。
最佳答案
以下是一些一般性评论:
您应该使用显式的join
语法。
您应该使用表别名。
转换日期后,无需格式化日期。
您应该以本机格式而不是字符串存储日期。group by
和order by
应该引用select
中的字段(如果适用)(p.cod
与v.cod_f
)。
然后,解决您的问题的方法是将where
条件移动到条件聚合语句中。因此,如果每个代码都出现在数据中(即使没有tdt
和local
的条件),那么它将出现在输出中。尝试这个:
select p.cod, coalesce(sum(case when tdt = 'V' and local = 'XCSUR' then v.can else 0 end), 0)
from venta v join
prueba p
on v.cod_f = p.cod
where tdt = 'V' and
local = 'XCSUR' and
yearweek(STR_TO_DATE(fec, '%d/%m/%Y')) between yearweek(curdate() - interval 8 week) and
yearweek(curdate())
group by p.cod
order by CHAR_LENGTH(p.cod), p.cod;
编辑:
您也可以通过重新排列表来进行外部联接。您必须将过滤子句放在
on
子句中:select p.cod, coalesce(sum(v.can), 0)
from prueba p left join
venta v
on v.cod_f = p.cod and
yearweek(STR_TO_DATE(fec, '%d/%m/%Y')) between yearweek(curdate() - interval 8 week) and
yearweek(curdate()) and
v.tdt = 'V' and
v.local = 'XCSUR'
group by p.cod
order by CHAR_LENGTH(p.cod), p.cod;
关于mysql - MySQL合并销售报告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26786783/