在同一小时内汇总列,如果该小时没有记录,则将值存储为0

时间:2015-10-12 09:02:17

标签: sql

说我有一张包含这些记录的表格:

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

2 个答案:

答案 0 :(得分:0)

请参阅以下代码:

UIViewController

输出:

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

我在MS-SQL中尝试了这个,因为我没有使用过MySQL。但是大多数逻辑仍然是相同的。我不确定的唯一部分是在MySQL中创建@temp临时表。如果你可以改变那部分(如果需要的话),你就是好人。

答案 1 :(得分: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语法可能略有不同。