2014-11-06 70 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