3
SELECT u.FirstName + ' ' + u.LastName as 'User',
COUNT(*) as 'Number of Calls',
CONVERT(varchar(4), SUM(CASE WHEN c.FromTime BETWEEN @FromDate AND @ToDate
THEN DATEDIFF(mi, c.FromTime, c.ToTime) ELSE 0 END)/60) + ':' +
CASE WHEN SUM(CASE WHEN c.FromTime BETWEEN @FromDate AND @ToDate
THEN DATEDIFF(mi, c.FromTime, c.ToTime) ELSE 0 END) % 60 < 10 THEN '0' ELSE '' END +
CONVERT(varchar(2), SUM(DATEDIFF(mi, c.FromTime, c.ToTime)) % 60) as 'Total Time Spent',
CONVERT(varchar(4), AVG(DATEDIFF(mi, c.FromTime, c.ToTime))/60) + ':' +
CASE WHEN AVG(DATEDIFF(mi, c.FromTime, c.ToTime)) % 60 < 10 THEN '0' ELSE '' END +
CONVERT(varchar(2), AVG(DATEDIFF(mi, c.FromTime, c.ToTime)) % 60) as 'Average Call Time'
FROM Calls c
JOIN Users u ON u.UserID = c.TakenBy
WHERE c.FromTime BETWEEN @FromDate AND @ToDate
GROUP BY u.UserID, u.FirstName, u.LastName
ORDER BY u.FirstName + ' ' + u.LastName
前面的SQL查詢返回正確的「呼叫數量」,但「總時間」和「平均時間」都是一樣的,無論呼叫#的(這顯然是錯誤的)。SQL SUM()函數忽略WHERE子句和CASE語句
我讀過並嘗試使用CASE WHEN __然後在SUM內部賦值ELSE 0,但它仍然返回一個不正確的值。
我能得到這個查詢返回正確結果的唯一方法是,如果我完全去除所有其他信息,例如
SELECT SUM(DATEDIFF(mi, FromTime, ToTime)) FROM Calls WHERE c.FromTime BETWEEN...
如何仍然可以使用我的JOIN和GROUP BY並獲得聚合函數來給我我想要的結果?
感謝您的幫助!
我認爲你正在試圖在選擇列中做太多的事情, 你可以嘗試將這一點分解成子查詢嗎? – zinking
爲了澄清這個建立一個選擇您的目標值第一。在那裏檢查正確的結果。之後你將他們分組並總結/平均列。 – YvesR
我同意上面的評論者,你需要簡化你的示例代碼來嘗試找到問題。因此,如果您可以在沒有額外CASE語句的情況下重新發布您的示例SQL(反正這不應該是必需的)。 –