我有这个代码:
insert into [dbo].[NGC_Agent_Intervals]
SELECT
AgentID,
date,
[Hour] = DATEPART(HOUR, RSRange),
hour_quarter = CONCAT(DATEPART(MINUTE, RSRange) ,'-', DATEPART(MINUTE, RERange)),
DepartmentID,
[DepartmentName],
[AgentState],
[AgentStateReason],
( select AgentStateReasonDescription from RealRanges) as AgentStateReasonDescription,
[ExtensionID],
[WorkstationID],
Duration = sum(CASE
WHEN RSRange <= aStart and aend >= RERange THEN DATEDIFF(SECOND, aStart, DATEADD(MINUTE, 15, RSRange))
when RSRange <= aStart and aend < RERange THEN DATEDIFF(SECOND, aStart, aEnd)
WHEN RERange >= aEnd THEN DATEDIFF(SECOND, RSRange, aEnd)
ELSE DATEDIFF(SECOND, RSRange, RERange)
END)
FROM RealRanges
WHERE DATEDIFF(SECOND, RSRange, aEnd) > 0
AND AgentState NOT IN ('logout', 'LOGIN')
GROUP BY duration,RealRanges.AgentID, RealRanges.date, RealRanges.hour,
DepartmentID,[DepartmentName], [AgentState], [AgentStateReason],
[ExtensionID],[WorkstationID], RSRange, RealRanges.RERange
我在使用 cte 将原始行从表中拆分为几行后运行此代码。如果几列在几行中匹配,我想要做的是对持续时间值求和。
那是原始表值,我想对持续时间求和: 如果我不对持续时间求和,它看起来像这样: 求和后应该是这样的:
唯一的问题是我只想对以下列进行分组:
AgentID
Date
hour
Hour_Quarter
AgentState
AgentStatereason
并排除其他列,因此即使 extensionid 不同(例如),我仍然可以从 2 列中得到总和。我尝试使用子查询(在上面的代码中)执行此操作,但出现错误:
那么我错过了什么?
为避免按返回多个值的特定列进行分组,您可以将其从查询中删除,也可以明确告诉它您想要哪个值。您可以使用聚合或分析函数来执行此操作,例如:
MAX(ExtensionID)
MIN(ExtensionID)
FIRST_VALUE(ExtensionID) OVER (...)
LAST_VALUE(ExtensionID) OVER (...)
对于数值,您还可以显示新值,例如:
SUM(Duration)
AVG(Duration)
ExtensionID
但基本上,如果你想显示从两个不同值折叠的单行,你需要定义如何做到这一点。在这种情况下,ExtensionID
重要吗?如果是,您要显示最新的吗?第一个?最常出现的一种?关系呢?所有这些都有解决方案,但您必须知道您希望查询返回什么。你不能
GROUP BY
像使用 MySQL 一样把事情排除在外,你会得到 - 比如说 - 奇怪的结果。