Sql-Server
通過排除列進行分組
我有這個程式碼:
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 一樣把事情排除在外,你會得到 - 比如說 - 奇怪的結果。