2013-01-15 63 views
1

我有一個顯示圖形的報告。 X軸使用以下查詢中的日期。在查詢沒有返回日期的地方,我收到了差距,並希望返回一個值。有沒有辦法強制沒有記錄的日期?MySQL查詢 - 包含沒有記錄的日期

SELECT 
    DATE(instime), 
    CASE 
     WHEN direction = 1 AND duration > 0 THEN 'Incoming' 
     WHEN direction = 2 THEN 'Outgoing' 
     WHEN direction = 1 AND duration = 0 THEN 'Missed' 
    END AS type, 
    COUNT(*) 
FROM taxticketitem 
GROUP BY 
    DATE(instime), 
    CASE 
     WHEN direction = 1 AND duration > 0 THEN 'Incoming' 
     WHEN direction = 2 THEN 'Outgoing' 
     WHEN direction = 1 AND duration = 0 THEN 'Missed' 
    END 
ORDER BY DATE(instime) 
+0

你是說「讓日期沒有記錄?」是什麼意思? –

+0

你的意思是說'instime'在你的數據庫中是NULL(在這種情況下查找'ISNULL'或'COALESCE',或者你的意思是有幾天你的數據庫中沒有記錄?如果是這樣的話,去與@SalmanA建議的答案如下 – Bridge

+0

您可以將您的日期列的默認設置設置爲()或current_date –

回答

1

一種可能的方法是創建一個日期表和LEFT JOIN您的表與他們。該表可以是這個樣子:

CREATE TABLE `datelist` (
`date` DATE NOT NULL, 
PRIMARY KEY (`date`) 
); 

和充滿之間的所有日期,說一月-01-2000通過DEC-31-2050(這裏是我的Date Generator script)。

接下來,編寫查詢這樣的:

SELECT datelist.date, COUNT(taxticketitem.id) AS c 
FROM datelist 
LEFT JOIN taxticketitem ON datelist.date = DATE(taxticketitem.instime) 
WHERE datelist.date BETWEEN `2012-01-01` AND `2012-12-31` 
GROUP BY datelist.date 
ORDER BY datelist.date 

LEFT JOIN和右表中的計數不爲空值,確保計數是正確的(0,如果沒有行存在一個給定的日期)。

0

您需要將一組日期設置爲LEFT JOIN您的表格。不幸的是,MySQL沒有辦法在運行中生成它。

你需要準備一個表,比如,從0連續十萬整數99999(或多久你認爲你最大的報告範圍會):

CREATE TABLE series (number INT NOT NULL PRIMARY KEY); 

,並使用它像這樣:

SELECT DATE(instime) AS r_date, CASE ... END AS type, COUNT(instime) 
FROM series s 
LEFT JOIN 
     taxticketitems ti 
ON  ti.instime >= '2013-01-01' + INTERVAL number DAY 
     AND ti.instime < '2013-01-01' + INTERVAL number + 1 DAY 
WHERE s.number <= DATEDIFF('2013-02-01', '2013-01-01') 
GROUP BY 
     r_date, type 
0

必須先做類似的事情。

您需要有一個子選擇來生成一個日期範圍。所有你想要的日期。最簡單的一個開始日期添加到一個號碼: -

SELECT DATE_ADD(SomeStartDate, INTERVAL (a.I + b.1 * 10) DAY) 
FROM integers a, integers b 

給定一個表稱爲整​​數與叫我用含0〜9 10行是SQL會給你一個範圍的100天開始SomeStartDate一列

然後,您可以將您的實際數據與該數據進行比較,以獲得完整的範圍。