Sql 将同一小时内的列相加,如果该小时没有记录,则将值存储为0

Sql 将同一小时内的列相加,如果该小时没有记录,则将值存储为0,sql,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 我通过以下查

假设我有一个包含以下记录的表:

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
     TIMEHOUR | INSTANCESUM
     6        | 7
---> 5        | 0 <---
     4        | 5
     3        | 5
     2        | 6
     1        | 6
但是如果没有,我需要一个小时来记录instancesum为0。假设UTC时间为06:00,表将返回如下内容:

TIMEHOUR | INSTANCESUM
6        | 7
4        | 5
3        | 5
2        | 6
1        | 6
     TIMEHOUR | INSTANCESUM
     6        | 7
---> 5        | 0 <---
     4        | 5
     3        | 5
     2        | 6
     1        | 6
请参阅下面的代码:

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临时表。如果您可以更改该部分(如果需要),您就可以了。

要回答原始问题,您可以在同一小时内将表左键联接到自身,并且在左键联接中一小时内未出现的实例应将其总和报告为null,然后您可以对输出0应用nvl处理作为其总和。大概是这样的:

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

回答评论中的第二个问题:

您应该能够以您想要使用的任何格式输出日期时间

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

至少这在Oracle中是可行的,MySQL语法可能略有不同。

接下来的问题是:有没有办法将TIMEHOUR显示为日期时间格式yyyy mm dd hh?在group by和order by中,它不应该是DATE而不是TIMEOURE?看起来像是个打字错误。@vnikhil是的,那是个打字错误。感谢您指出,您需要一个统计表,提供所有需要的值(1到24?)。然后你可以在FROM和LEFT中使用它来连接你的数据。你知道这个的mssql版本吗?无法让它工作你的错误是什么?这是所有感兴趣的air代码,所以它可能有语法问题,但在概念上它应该可以工作。