2015-10-12 30 views
2

說,我有這些記錄的表:總和列,如果沒有記錄這一個小時,店內價值爲0

Date     |Instances 
2015-10-12 06:15:00.000 |2 
2015-10-12 06:45:00.000 |5 
2015-10-12 04:15:00.000 |2 
2015-10-12 04:25:00.000 |3 
2015-10-12 03:15:00.000 |5 
2015-10-12 02:15:00.000 |6 
2015-10-12 01:15:00.000 |6 

我管理總結在同一時刻所有的實例用下面的查詢一起:

SELECT DATEPART(HOUR,DATE) as TIMEHOUR, 
     SUM([INSTANCES]) as INSTANCESUM 
    FROM TABLE (NOLOCK) 
    where DATE BETWEEN DATEADD(HOUR, -5, GETUTCDATE()) AND GETUTCDATE() 
    group by DATEPART(HOUR, DATE) 
    order by DATEPART(HOUR, DATE) DESC 

的結果是這樣的:

TIMEHOUR | INSTANCESUM 
6  | 7 
4  | 5 
3  | 5 
2  | 6 
1  | 6 

但我需要的侯如果沒有,則記錄例數爲0。說UTC時間是06:00表將返回這樣的事情:

 TIMEHOUR | INSTANCESUM 
    6  | 7 
---> 5  | 0 <--- 
    4  | 5 
    3  | 5 
    2  | 6 
    1  | 6 

它是可能的MS SQL?

[編輯]

我需要的是一個結果表中總會有根據我設置的時間範圍條目相同的量。所以,即使在那個時間範圍內沒有記錄,結果表仍然有數量的紀錄,只是0的值

TIMEHOUR | INSTANCESUM 
6  | 0 
5  | 0 
4  | 0 
3  | 0 
2  | 0 
1  | 0 
+0

後續問題:有沒有辦法將TIMEHOUR作爲DATETIME格式顯示yyyy-mm-dd hh? – gin

+0

不應該是* DATE *而不是* TIMEHOUR *在組中,並按順序排列?看起來這是一個錯字。 – niksofteng

+0

@vnikhil是的,這是一個錯字。感謝您指出這一點 – gin

回答

0

請參見下面的代碼:

declare @temp table (timehour int, instancesum int) 
insert into @temp values (6,7), (4,5), (3,5), (2,6), (1,6) -- Replace values with your original query. 

select timehour, instancesum from @temp 
union 
select l.timehour + 1 as timehour, 0 
from 
    @temp as l 
    left join @temp as r on l.timehour + 1 = r.timehour 
where 
    l.timehour < (select max(timehour) from @temp) and 
    r.timehour is null 

輸出:

timehour instancesum 
1   6 
2   6 
3   5 
4   5 
5   0 
6   7 

我在MS-SQL中試過這個,因爲我沒有在MySQL上工作。但是大多數邏輯將保持不變。我不確定的唯一部分是在MySQL中創建@temp臨時表。如果你可以改變這個部分(如果需要)你很好。

0

要回答原來的問題,您可以在平等時間內將表格自行加入,而在左側連接中一小時內沒有出現的實例應將其總和報告爲空,然後您可以應用nvl治療輸出0作爲他們的總和。事情是這樣的:

SELECT 
DATEPART(t.HOUR,t.DATE) as TIMEHOUR 
, nvl(SUM([ti.INSTANCES]), 0) as INSTANCESUM 

FROM TABLE (NOLOCK) as t 
left join TABLE  as ti 
on 
DATEPART(t.HOUR,t.DATE) = 
DATEPART(ti.HOUR,ti.DATE) 

where 
DATE BETWEEN DATEADD(HOUR, -5, GETUTCDATE()) AND GETUTCDATE() 
  
group by 
DATEPART(HOUR, DATE) 
order by 
DATEPART(HOUR, DATE) DESC 

要回答你的第二個問題的意見:

你應該能夠輸出任何格式的日期時間你想使用

To_char(date, 'yyyymmdd hh:mm:ss') 

至少這是Oracle的工作原理,MySQL的語法可能略有不同。

+0

你知道這個的mssql版本嗎?不能讓它起作用 – gin

+0

你得到的錯誤是什麼?這是所有感興趣的空氣代碼,所以它可能有語法問題,但概念上它應該工作。 – Jeff

相關問題