Sql-Server

通過排除列進行分組

  • March 20, 2018

我有這個程式碼:

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 列中得到總和。我嘗試使用子查詢(在上面的程式碼中)執行此操作,但出現錯誤: 錯誤

那麼我錯過了什麼?

為避免按返回多個值的特定列進行分組,您可以將其從查詢中刪除,也可以明確告訴它您想要哪個值。您可以使用聚合或分析函式來執行此操作,例如:

對於數值,您還可以顯示新值,例如:

  • SUM(Duration)
  • AVG(Duration)

ExtensionID但基本上,如果你想顯示從兩個不同值折疊的單行,需要定義如何做到這一點。在這種情況下,ExtensionID重要嗎?如果是,您要顯示最新的嗎?第一個?最常出現的一種?關係呢?所有這些都有解決方案,但必須知道您希望查詢返回什麼。

你不能GROUP BY像使用 MySQL 一樣把事情排除在外,你會得到 - 比如說 - 奇怪的結果。

引用自:https://dba.stackexchange.com/questions/201783