2014-11-06 71 views
0

我有2个表:“prueba”是目录与所有的说明和代码的产品。MySQL的联合销售报告

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 

与“文塔”包含销售:

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 

在此先感谢。

回答

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; 
+0

第二个显示我正在查找的结果。谢谢。 – user3063952 2014-11-06 18:57:45