2014-03-25 47 views
0

嘗試設置存儲過程以用於多系列圖表,並且需要爲每個客戶填寫提交範圍中的每個日期(即通過IN的變量)的日期值,即使存在在特定日期沒有該客戶的交易數據。MySQL在數據缺失情況下左連接填充值

我有這樣的查詢:

select 
Customer.Name 
, sum(if(Transaction.StopTime > Transaction.StartTime, Transaction.StopTime - Transaction.StartTime,0)) as TimeSpent 
, Transaction.Date 

from Customer 

left outer join Transaction ON Transaction.CustomerID = Customer.CustomerID 
    and Transaction.Date >= str_to_date(DateFrom,'%m/%d/%Y') 
    and Transaction.Date <= str_to_date(DateTo,'%m/%d/%Y') 

group by Customer.Name, Transaction.Date 

返回是這樣的:

Name | TimeSpent | Date 
------------------------------ 
john | 6   | 2014-03-01 
mary | 12   | 2014-03-01 
john | 0   | NULL 
mary | 12   | 2014-03-02 
john | 4   | 2014-03-03 
mary | 0   | NULL 

有沒有辦法讓日期的所有行通過子查詢或循環通過填充通過變量的值?

像這樣:

Name | TimeSpent | Date 
------------------------------ 
john | 6   | 2014-03-01 
mary | 12   | 2014-03-01 
john | 0   | 2014-03-02 
mary | 12   | 2014-03-02 
john | 4   | 2014-03-03 
mary | 0   | 2014-03-03 
+0

你想要日期的自定義值? – Hackerman

+0

需要爲所有行填充日期,將期望的結果添加到帖子末尾 – TransitDataHead

回答

0

您可以通過使用cross join得到的範圍內的所有可能的日期做到這一點。然後你可以使用此字段爲left join,並在select

select c.Name, 
     sum(if(t.StopTime > t.StartTime, t.StopTime - t.StartTime,0)) as TimeSpent, 
     td.Date 
from Customer c cross join 
    (select distinct t.date 
     from Transaction t 
     where t.Date >= str_to_date(DateFrom, '%m/%d/%Y') and 
      t.Date <= str_to_date(DateTo, '%m/%d/%Y') 
    ) td left outer join 
    Transaction t 
    ON t.CustomerID = c.CustomerID and 
     t.date = td.date 
group by c.Name, td.Date; 

在另一方面,你應該在前綴變量的習慣得到如DateFrom的東西(如v_DateFrom),所以他們不混淆列在桌子裏。

+0

只要每個日期至少存在一個事務,就會工作。 –

+0

CROSS JOIN - 呃!這似乎是完全按照希望工作 - 謝謝你! – TransitDataHead