2014-03-25 46 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