【发布时间】:2018-02-10 03:50:01
【问题描述】:
最佳实践问题。我有一张DATED, AgentName, Available_Time (DATETIME) 的桌子。日期不是连续的,例如缺少所有周末,同样AgentName 并非每天都存在。
我试图在给定的日期范围内为每个用户获取SUM 和AVG。目前,我有一个浏览所有可用日期的光标,里面是另一个浏览该日期所有名称的光标。我曾希望使用SUM(COLUMN),但你不能用DATETIME 做到这一点,你只能使用COLUMN + COLUMN。我尝试转换为TIME,它可以工作,除非它总计超过 24 小时,它会回滚到 00:00:000 并且我失去了时间。我在想CTE,但仍然无法使用sum。下面的代码基本上是对其进行建模,但显然给我的是行而不是总和。数据集很小,所以游标不是问题,我只是不喜欢它们:)。想法?
if OBJECT_ID('tempdb..#RESULTS') is not null
drop table #RESULTS;
CREATE TABLE #RESULTS (AgentName NVARCHAR(100)
,DATED DATE
,Available_Time DATETIME
)
INSERT INTO #RESULTS
VALUES
('007','1/1/2018','1900/01/01 02:33:51')
,('007','1/2/2018','1900/01/01 00:32:37')
,('007','1/3/2018','1900/01/01 01:02:54')
,('007','1/4/2018','1900/01/01 01:22:14')
,('007','1/5/2018','1900/01/01 01:48:42')
,('007','1/7/2018','1900/01/01 01:16:07')
,('007','1/9/2018','1900/01/01 02:25:56')
,('007','1/11/2018','1900/01/01 02:00:09')
,('007','1/13/2018','1900/01/01 12:36:01')
,('007','1/15/2018','1900/01/01 11:56:25')
,('K','1/11/2018','1900/01/01 02:00:09')
,('K','1/13/2018','1900/01/01 12:36:01')
,('K','1/15/2018','1900/01/01 11:56:25')
if OBJECT_ID('tempdb..#RESULTS2') is not null
drop table #RESULTS2;
CREATE TABLE #RESULTS2 (RNUMBER INT
,AgentName NVARCHAR(100)
--,DATED DATE
,Available_Time DATETIME
)
INSERT INTO #RESULTS2
SELECT ROW_NUMBER() OVER (PARTITION BY AGENTNAME ORDER BY DATED) RNUM
,AgentName
--,DATED
,Available_Time
from #RESULTS
;
WITH DATEAGG AS
(SELECT *
FROM #RESULTS2
)
SELECT d.AgentName
,d.Available_Time + d2.Available_Time - '1900-01-01 00:00:00.000'
FROM DATEAGG d
LEFT JOIN DATEAGG d2
on d.AgentName = d2.AgentName
and d.RNUMBER = d2.RNUMBER +1
所以最终输出(这是不正确的,但)看起来像:
Agent | Total Time
007 | 1900/01/02 11:54:23
K | 1900/01/01 01:54:23
从那里我可以轻松地 DATEDIFF(ss,1900/01/01,RESULT) 并获得总时间。 最终答案类似于(取决于我的格式)
Agent | Total Time
007 | 2D 11:54:23
K | 0D 01:54:23
【问题讨论】:
-
那么日期和时间是日期字段和日期时间字段的组合,其中日期从后者中剥离?您可以先将日期转换为数字。不确定这是否是理想的方式。
-
不清楚您要聚合什么。也许如果您将代码包含在您提到的光标中
-
您在发布 ddl 和示例数据方面做得很好。不幸的是,这里所需的输出像泥浆一样清晰。你能发布你期望的输出吗,也许是对到达那里的逻辑的解释?
-
为清楚起见,抱歉编辑。
-
你可以改变你的表结构吗?因为我很确定你做错了。
AvailableTime是一天中的实际时间,还是时间量?我假设是后者,因为“总结”一天中时间的想法很愚蠢。
标签: sql sql-server sql-server-2012