2015-11-05 120 views
0

我已經問過類似的問題,但我似乎仍然無法讓我的頭在附近。我有我的SQL數據庫缺少範圍mysql中的缺失值

2015-07-14 12:35:19 
2015-07-15 12:45:37 
2015-07-15 12:45:37 
2015-07-16 12:35:37 
2015-08-14 10:35:21 
2015-08-14 12:15:36 

我聚集在幾個星期這些日期值的列DEVICE_CREATE_DATE,但也有在幾個星期,在那裏我想這些值剛好等於0,這樣我可以主持人它們之間的遺漏值與其他指標在Excel表中。我創建了一個虛擬表「日期」來加入這些值,以便選擇在沒有值的情況下返回0。

這裏是我使用的查詢,

select date.year, week(device.device_create_date), count(*) 
from device 
join date 
on date.week_of_year=week(device.device_create_date) 
where device.id_customer = 1 
group by device.year, date.WEEK_OF_YEAR 
order by device.year, date.week_of_year; 

這是我回來後,

2010 26 7252 
2010 31 3108 
2010 45 7203 
2010 1 9324 
2010 2 7252 
2010 3 2072 

這是我希望它給我回什麼;

2010 1 9324 
2010 2 7252 
2010 3 2072 
2010 4 0 
2010 5 0 
2010 6 0 
etc 

順便說一句,這些值似乎沒有被任何匹配的數據庫上的算的,所以我有點知道我在做什麼完全錯誤的,但我不偉大在這個所以任何幫助和指導將不勝讚賞。

預先感謝您!

+1

我們需要'device'的結構.. –

+1

在這種情況下使用正確的連接,而不是內部連接。此外,如果您有多年的數據,那麼您需要在日期表中使用年份和星期,並加入兩者。 – Shadow

回答

1

因爲你總是希望從date表中的值(以獲得所有可能的日期),並且從device匹配的行,你會想用date作爲源,使用left joindevice表,因爲一個inner join不僅會返回兩個表中匹配的數據。

試試這個:

select date.year, date.week_of_year, count(device.device_create_date) 
from date 
left join device on date.week_of_year = week(device.device_create_date) 
       and device.id_customer = 1 
group by date.year, date.week_of_year 
order by date.year, date.week_of_year; 

如果您的表包含從一年以上的數據,你應該爲一年多年添加條件的加入讓你不要混用數據。

+0

這工作奇蹟,非常感謝你jpw非常感謝,我發現錯誤以及你的評論後,而不是計數(*),計算設備創建日期。我15歲以下,所以我不能投你的評論,但它是完美的! –

+0

@NickKo如果你有'date'表中未來數年的數據,你需要添加一個過濾器來獲得你想要的年份:'where date.year = 2015'。你應該添加'和date.year = year(device.device_create_date)'給連接。 – jpw

+0

我讀了最後一個評論,回答了一下晚了,是的,現在一切正常,謝謝。 #豎起大拇指 –