SQL 计数为零值

标签 sql sql-server count

我想为过去 24 小时的数据集创建一个图表。

我找到了一个可行的解决方案,但这非常糟糕,因为我外部连接的表包含数据库中的每一行,因为我在分组依据中使用(现已弃用)“all”参数。

这是目前有效的解决方案。 首先,我声明日期间隔是从现在起 24 小时后的时间。我声明了两次,这样我也可以在稍后的过程中使用它。

Declare @StartDate datetime = dateadd(hour, -24, getdate())
Declare @StartDateProc datetime = dateadd(hour, -24, getdate())
Declare @EndDate datetime = getdate()

我将日期填充到临时表中,其中包括特殊格式的日期环。

create table #tempTable
(
    Date datetime,
    DateString varchar(11)
)

while @StartDate <= @EndDate
begin
    insert into #tempTable (Date, DateString)  
    values (@StartDate, convert(varchar(8), @StartDate, 5) + '-' + convert(varchar(2), @StartDate, 108));

    SET @StartDate = dateadd(hour,1, @StartDate);
end

这给了我如下所示的数据:

Date                              DateString
---------------------------------------------
2015-12-09 13:59:01.970           09-12-15-13
2015-12-09 14:59:01.970           09-12-15-14
2015-12-09 15:59:01.970           09-12-15-15
2015-12-09 16:59:01.970           09-12-15-16

所以我想要的是将我的数据集加入匹配的日期字符串并显示日期,即使匹配的行为零。

这是查询的其余部分

select
    Date = c.Date,
    Amount = sum(c.Amount)
from 
    DbTable a
outer apply 
    (select 
         Date = b.DateString,
         Amount = count(*)
     from 
         #tempTable b
     where
         convert(varchar(8), a.DateColumn, 5) + '-' + convert(varchar(2), a.DateColumn, 108) = b.DateString
     group by all
         b.DateString) c
where 
    a.SomeParameter = 'test' and
    a.DateColumn >= @StartDateProc and
    a.DateColumn <= @EndDate
group by
    c.Date

drop table #tempTable

测试显示实际数据:

Declare @StartDate datetime = dateadd(hour, -24, getdate())
Declare @EndDate datetime = getdate()

select  
    dateString = convert(varchar(8),a.DateColumn,5) + '-' + convert(varchar(2),a.DateColumn, 108),
    Amount = COUNT(*)
from 
    DbTable a   

where
    a.someParameter = 'test' and
    a.DateColumn>= dateadd(hour, -24, getdate()) and
    a.DateColumn<= getdate()

group by 
    convert(varchar(8),a.DateColumn,5) + '-' + convert(varchar(2),a.DateColumn, 108)

第一个输出行:

dateString     Amount
09-12-15-14    1
09-12-15-15    1
09-12-15-16    1
09-12-15-17    3
09-12-15-18    1
09-12-15-22    3
09-12-15-23    2

正如您在此处看到的,没有 19:00 到 21:00 的时间数据。这就是我想要的数据显示方式:

dateString     Amount
09-12-15-14    1
09-12-15-15    1
09-12-15-16    1
09-12-15-17    3
09-12-15-18    1
09-12-15-19    0
09-12-15-20    0
09-12-15-21    0
09-12-15-22    3
09-12-15-23    2

最佳答案

通常,这将通过左连接而不是外部应用来实现。逻辑很简单:保留第一个表中的所有行以及第二个表中的任何匹配信息。这意味着将日期表放在第一位:

select tt.DateString, count(t.DateColumn) as Amount
from #tempTable tt left join
     DbTable t
     on convert(varchar(8), t.DateColumn, 5) + '-' + convert(varchar(2), t.DateColumn, 108) = tt.DateString and 
        t.SomeParameter = 'test'
where tt.Date >= @StartDateProc and
      tt.Date <= @EndDate
group by tt.DateString;

此外,您对日期的比较似乎过于复杂,但如果它适合您,那么它就有效。

关于SQL 计数为零值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34202768/

相关文章:

sql - 在 PostgreSQL 中计算移动天气统计数据

sql - 将 session 变量传递到 asp :gridview's sqldatasource select command

SQL扫描表更新值

SQL 选择不同列和最新日期

c# - DateTime 以毫秒表示?

xml - 计算具有多个条件的 xml 元素

Python Pandas 不正确的日期计数

sql - Oracle子查询与Join - 如何引用子查询列?

sql - 这些日期 where 子句有什么区别?

arrays - 计算数组中不同元素的数量