簡體   English   中英

MySQL在沒有數據的情況下左連接填充值

[英]MySQL left join populating value in absence of data

嘗試設置存儲過程以用於多系列圖表,並且即使在特定日期沒有該客戶的交易數據,也需要為每個客戶在提交范圍內的每個日期(傳遞給IN的變量)填充日期值。

我有這樣的查詢:

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

您可以使用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 )的習慣,這樣它們就不會與表中的列混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM