0

我需要获取当天每位用户每小时的总通话次数,然后计算该用户接听的来电百分比。归根结底的目的是计算每个用户每小时的红利底池百分比。

我可以获得大部分信息,但我无法计算每小时的总通话次数,即每个小时组的总通话次数......

假设以下数据(必要时将日期更改为当前日期):

EnteredBy           EnteredOn
Lisa Scandaleyes    05/07/2017 07:40:04
Fred Smith          05/07/2017 07:54:17
A User              05/07/2017 08:15:06
Johnny Johnson      05/07/2017 08:20:57
A User              05/07/2017 09:27:29
A User              05/07/2017 09:36:16
A User              05/07/2017 09:42:36
A User              05/07/2017 10:09:57

我可以很容易地每小时接听电话:

SELECT DATEPART(HOUR, [EnteredOn]) AS Hour, Count(*) as CallsPerHour
FROM CallHandlingCallData 
WHERE DATEDIFF(d, EnteredOn, GetDate())= 0 
GROUP BY DATEPART(HOUR, [EnteredOn])
ORDER BY Hour;

我还可以获得每个用户每小时的电话:

SELECT DATEPART(HOUR, [EnteredOn]) AS Hour, EnteredBy, Count(*) as CallsTaken
FROM CallHandlingCallData 
WHERE DATEDIFF(d,EnteredOn, GetDate())= 0
GROUP BY DATEPART(HOUR, [EnteredOn]), EnteredBy
ORDER BY Hour, EnteredBy;

我什至可以得到我想要的几乎所有东西,除了 TotalCalls 值,因此百分比基于当天的 ALL CALLS:

SELECT Hour, EnteredBy, CallsTaken, TotalCalls, 
CAST(CallsTaken AS Decimal(10,2)) * 100 / CASE TOTALCALLS WHEN 0 THEN 1 ELSE TotalCalls END AS Percentage 
FROM
(
    SELECT DATEPART(HOUR, [EnteredOn]) AS Hour, EnteredBy, Count(*)as CallsTaken, 
    (SELECT Count(*) FROM CallHandlingCallData WHERE DATEDIFF(d, EnteredOn, GetDate())= 0) AS TotalCalls
    FROM CallHandlingCallData
    WHERE DATEDIFF(d,EnteredOn, GetDate())= 0
    GROUP BY DATEPART(HOUR, [EnteredOn]), EnteredBy
) data
ORDER BY Hour, EnteredBy;

这真的很接近,我只需要让子查询给我那个小时的总呼叫数,而不是一整天。

笔记

  1. 我无法使用 OVER(),因为可能与最终查询一起使用的数据库引擎之一不支持它。
  2. 我更愿意在 UI 中进行此类计算,但结果必须输出到电子表格中删除该选项

任何建议将不胜感激。

4

1 回答 1

0

分别计算组总数,然后将它们连接起来。

SELECT 
    DATEPART(HOUR, C1.EnteredOn) AS [Hour], 
    C1.EnteredBy, 
    COUNT(*) AS CallsTaken, 
    Totals.TotalCalls, 
    CAST(COUNT(*) * 100.0 / Totals.TotalCalls AS DECIMAL(10, 2)) AS [Percentage]
FROM CallHandlingCallData AS C1
JOIN (
    SELECT DATEPART(HOUR, C2.EnteredOn) AS [Hour], COUNT(*) AS TotalCalls
    FROM CallHandlingCallData AS C2
    WHERE DATEDIFF(d, C2.EnteredOn, GetDate()) = 0
    GROUP BY DATEPART(HOUR, C2.EnteredOn)
) Totals ON Totals.[Hour] = DATEPART(HOUR, C1.EnteredOn) 
WHERE DATEDIFF(d, C1.EnteredOn, GetDate()) = 0
GROUP BY 
    DATEPART(HOUR, C1.EnteredOn), 
    C1.EnteredBy, 
    Totals.TotalCalls

如果看起来我在使用别名时做得过火了:我发现在消除内部和外部列引用的歧义时,安全比抱歉要好得多。

如果您需要在几个小时内也没有发生任何事情的零行,那就是一个完整的“另一壶鱼UNION ALL和数字表,除非我们必须这样做,否则我不会去那里。

于 2017-07-05T15:44:56.587 回答