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クエリは正しい「呼び出し数」を返しますが、「合計時間」と「平均時間」は呼び出しの数に関係なく常に同じです(これは明らかに間違っています)。

CASE WHEN __Then値ELSE0をSUM内で読んで実装しようとしましたが、それでも誤った値が返されます。

このクエリで正しい結果を返す唯一の方法は、他のすべての情報を完全に削除することです。

SELECT SUM(DATEDIFF(mi, FromTime, ToTime)) FROM Calls WHERE c.FromTime BETWEEN...

JOINとGROUPBYを使用して集計関数を取得し、必要な結果を得るにはどうすればよいですか?

助けてくれてありがとう!

4

1 に答える 1

1

おそらく、サブクエリを使用したほうがよいでしょう。たとえば、SELECT 部分に のようなものを追加します(SELECT SUM(...) FROM ... WHERE ...) AS total_sum

于 2012-06-06T09:15:58.090 に答える