使用条件计算列,根据计数

时间:2016-02-05 15:15:26

标签: sql-server tsql

我有一张包含通话记录的表格。我需要根据电话号码可以到达的时隙为下次呼叫分配时隙。

该表的相关栏目是:

电话号码| CallTimeStamp

CallTimeStamp是一个日期时间对象。

我需要计算以下内容:

  • 时段:从TimeStamp,我需要为每个电话号码计算每个时段的计数(例如,0800-1000,1001-1200等)。现在,如果特定时隙的计数大于'n',那么我需要将该时隙分配给该数字。否则,我选择一个默认时隙。
  • 平日时段:与上述相同,但与工作日相同。
  • 优先级:基本上是达到数量的次数

我已经解决了这些问题:

优先级

计算电话号码的电话号码是直接的。如果呼叫日志中存在一个号码,我知道它已被呼叫。在这种情况下,以下查询将为我提供每个号码的呼叫计数。

SELECT DISTINCT(PhoneNumber), COUNT(PhoneNumber) FROM tblCallLog
GROUP BY PhoneNumber

但是,我的问题是我需要根据该列本身的值更改字段Count(PhoneNumber)中的值。我该如何实现这一目标? (例如,如果Count(PhoneNumber)给我一个值> 20,我需要将它改为5)。

时段/工作日

这是我完全被困难的地方,我正在寻找“数据库”的做事方式。

不幸的是,我无法摆脱我的思维迭代过程。例如,如果我正在汇总某个电话号码(比如'123456')和某个时段(比如说在0800-1000之间),我可以写一个这样的查询:

DECLARE @T1Start time = '08:00:00.0000'
DECLARE @T2End time = '10:00:00.0000'

SELECT COUNT(CallTimeStamp) FROM tblCallLog 
WHERE PhoneNumber = '123456' AND FORMAT(CallTimeStamp, 'hh:mm:ss') >= @T1Start AND FORMAT(CallTimeStamp, 'hh:mm:ss') < @T2End

现在,我可以浏览表格中的每个不同电话号码,计算每个时段的值,然后为电话号码指定一个插槽值。但是,必须有一种不涉及我遍历数据库的方法。

所以,我正在寻找有关如何解决这个问题的建议。

由于

2 个答案:

答案 0 :(得分:1)

您可以使用DATEPART功能获取工作日时段。 要计算时间段,您可以尝试将分钟数从一天开始除以并将其除以时间段的大小。它会返回你的插槽号码。您可以使用CASE语句将其转换为正确的字符串或外观表,以便存储插槽描述。

SELECT 
    PhoneNumber
    , DATEPART(WEEKDAY, l.CallTimeStamp) AS DayOfWeekSlot
    , DATEDIFF(MINUTE, CONVERT(DATE, l.CallTimeStamp), l.CallTimeStamp) / 120 AS TwoHourSlot /*You can change number of minutes to get different slot size*/
    , COUNT(*) AS Count
FROM tblCallLog l
GROUP BY PhoneNumber
    , DATEPART(WEEKDAY, l.CallTimeStamp) 
    , DATEDIFF(MINUTE, CONVERT(DATE, l.CallTimeStamp), l.CallTimeStamp) / 120

答案 1 :(得分:0)

您可以尝试此操作来返回电话号码,星期几和2小时的时段。如果呼叫量大于20,则该值设置为5(不确定为什么为5?)。 2小时部分的代码改编自此问题How to Round a Time in T-SQL,其中(24/2)中的值2是您的时间段内的小时数。

SELECT  
      PhoneNumber
    , DATENAME(weekday,CallTimeStamp) as [day]
    , CONVERT(smalldatetime,ROUND(CAST(CallTimeStamp as float) * (24/2),0)/(24/2)) AS RoundedTime
    , CASE WHEN COUNT(*) > 20 THEN 5 ELSE COUNT(*) END
FROM 
      tblCallLog
GROUP BY      
      PhoneNumber
    , DATENAME(weekday,dateadd(s,start_ts,'01/01/1970'))