Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按小时计算行数并包括零_Sql_Sql Server_Sql Server 2008_Tsql_Count - Fatal编程技术网

Sql 按小时计算行数并包括零

Sql 按小时计算行数并包括零,sql,sql-server,sql-server-2008,tsql,count,Sql,Sql Server,Sql Server 2008,Tsql,Count,我试图按小时计算数据库中的条目数。我已经成功地编写了一个按小时计数的查询,但它忽略了零条目的小时。我需要结果包括零。我在互联网上浏览了一下,发现了很多建议。我创建了一个视图,其中有一列按分钟显示日期时间条目。我尝试将主表连接到此视图,得到的结果与未连接时相同。仍然没有零。想知道如何让这个查询返回零。我正在使用MS SQL 2008 R2。有什么建议吗 declare @limit datetime; use InputArchive set @limit = current_timestamp;

我试图按小时计算数据库中的条目数。我已经成功地编写了一个按小时计数的查询,但它忽略了零条目的小时。我需要结果包括零。我在互联网上浏览了一下,发现了很多建议。我创建了一个视图,其中有一列按分钟显示日期时间条目。我尝试将主表连接到此视图,得到的结果与未连接时相同。仍然没有零。想知道如何让这个查询返回零。我正在使用MS SQL 2008 R2。有什么建议吗

declare @limit datetime;
use InputArchive
set @limit = current_timestamp;
set @limit = DATEADD(hour, -72, @limit);
SELECT DATEADD(hour, datediff(hour, 0, ArchivedItems.RecordCreated), 0) as TimeHour, COUNT(ISNULL((ArchivedItems.RecordCreated),' ')) as NumPerHour
FROM ArchivedItems 
LEFT OUTER JOIN vw_hoursalot
ON vw_hoursalot.dtHr = ArchivedItems.RecordCreated
where InputTypeId = 5 or InputTypeId = 6 or InputTypeId = 8 and (ArchivedItems.RecordCreated >= @limit)
Group BY DATEADD(hour, Datediff(hour, 0, ArchivedItems.RecordCreated), 0)
order by DATEADD(hour, datediff(hour, 0, ArchivedItems.RecordCreated), 0) desc
option (MAXRECURSION 0)
更新:我将Hoursaot视图更改为按小时显示 很抱歉,我不确定您所说的全视图SQL是什么意思


出于法律原因,我无法从archivedItems表中放置任何strait信息,但RecordCreated列是strait时间戳,即'2013-04-05 14:09:59.167'

尝试将vw_Hoursalt作为条件中最左边的表-这意味着将返回视图中的所有行,是否找到ArchivedHours中的相应记录

我再次编辑了—这次我花时间模拟了一些虚拟数据,我意识到代码中的一个问题,无论是我的还是你的,就是ArchivedItems.RecordCreated列在WHERE条件下被用作过滤器。因此,仅返回具有现有RecordCreated值的记录

我已将该条件移动到联接,并针对我模拟的一些非常基本的数据运行下面的查询。假设您的vw_Hoursaot视图返回24个编号为0-23的整数,这应该会得到您要查找的数据

请注意:我假设InputTypeID来自ArchivedItems


以下是我的想法:

declare @limit datetime;
declare @BaseTime datetime
set @BaseTime = '20141020 15:00'; --must be an even hour
set @limit = DATEADD(hour, -72, @BaseTime);
print @Basetime
;WITH
  D1(N) AS (
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
           ),
  D2(N) AS (SELECT 1 FROM D1 a, D1 b),
  Numbers AS (SELECT TOP (100) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))-1 AS Number FROM D2),
  AllHours AS (SELECT DATEADD(hour,numbers.number,@limit) AS hr FROM Numbers),
  Raw_Data AS (
    SELECT DATEADD(hour,DATEDIFF(hour,@BaseTime,RecordCreated),@BaseTime) AS HourRecorded FROM
    ArchivedItems
    WHERE RecordCreated BETWEEN @limit AND @BaseTime
    AND InputTypeID IN (5,6,8)
    )
SELECT count(Raw_Data.HourRecorded),AllHours.hr
FROM AllHours left outer join Raw_Data on AllHours.hr = Raw_Data.HourRecorded
GROUP BY AllHours.hr
order by AllHours.hr
下面是我用来创建测试数据的内容

;WITH
  D1(N) AS (
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
           ),
  D2(N) AS (SELECT 1 FROM D1 a, D1 b),
  D4(N) AS (SELECT 1 FROM D2 a, D2 b),
  Numbers AS (SELECT TOP (10000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))-1 AS Number FROM D4)
INSERT INTO ArchivedItems(InputTypeID, RecordCreated) 
SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) % 10 AS INT)), DATEADD(MINUTE, ABS(CAST(CAST(NEWID() AS VARBINARY) % 10000 AS INT)),'20141017')
FROM Numbers
--Make sure there is a gap
DELETE FROM ArchivedItems WHERE RecordCreated BETWEEN '2014-10-20 06:00:00.000' AND '2014-10-20 08:00:00.000'

要么颠倒顺序,要么将条件更改为正确的外部联接-您需要此查询以完整小时列表开始,然后连接到另一端。正确的外部联接和按顺序交换都不起作用。它们都返回相同的内容,即两行,每行一次计数的结果。快速回复应该不止两行。那也不行我得到的结果是这样的,时间一小时努姆普尔1 2013-10-28 08:00:00:000 1 2 2013-10-25 21:00:00:000 1这是我仅有的两排。应该不止这些。好的,我尝试了另一个示例-如果这不起作用,请使用完整视图SQL和ArchivedItems表中的一些示例数据编辑您的问题。该代码也没有起作用。我仍然得到一个没有零计数的返回。当我输入一些样本数据并仔细查看时,我意识到您的WHERE子句过滤掉了ArchivedItems中没有相应匹配的任何小时数。请尝试此最新编辑中的代码。其中很大一部分是创建动态工时表。您可以通过预先制作全部或部分内容来大大缩短它。
;WITH
  D1(N) AS (
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
            SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
           ),
  D2(N) AS (SELECT 1 FROM D1 a, D1 b),
  D4(N) AS (SELECT 1 FROM D2 a, D2 b),
  Numbers AS (SELECT TOP (10000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))-1 AS Number FROM D4)
INSERT INTO ArchivedItems(InputTypeID, RecordCreated) 
SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) % 10 AS INT)), DATEADD(MINUTE, ABS(CAST(CAST(NEWID() AS VARBINARY) % 10000 AS INT)),'20141017')
FROM Numbers
--Make sure there is a gap
DELETE FROM ArchivedItems WHERE RecordCreated BETWEEN '2014-10-20 06:00:00.000' AND '2014-10-20 08:00:00.000'