我有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 byorder by应该引用select中的字段(如果适用)(p.codv.cod_f)。


然后,解决您的问题的方法是将where条件移动到条件聚合语句中。因此,如果每个代码都出现在数据中(即使没有tdtlocal的条件),那么它将出现在输出中。尝试这个:

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/

10-12 01:08