[英]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.