2013-07-04 117 views
2

我试图完成一个程序的问题。我有一张存储三个时间戳的表格。它用于统计查询和响应。第一个时间戳用于查询日期和时间(Date_Sent),另外两个是我们第一次对查询(FirstResponse)做出响应的专家之一,以及当查询得到满足时(LastResponse)。我应该创建基于以下条件的曲线图:在一条SQL语句中计算多个值

  1. 每月的查询总数
  2. 查询的数量在不到两个小时
  3. 查询的数量较少回应回应超过24小时,但在两个
  4. 查询的数量在不到48小时的反应,但超过24
  5. 查询的数量在不到72小时的反应,但超过48
  6. 查询的数量更少的响应超过96小时,但超过72

我能够做的第一个要求:

SELECT Count(Date_Sent) AS TotalQueries, 
     SUBSTRING(CONVERT(VARCHAR(11), Date_Sent, 113), 4, 8) AS Month, 
     RIGHT(CONVERT(VARCHAR(7), Date_Sent, 120), 2) AS Month_Order 
FROM AskAO.dbo.AskAO_Stats 
WHERE Date_Sent BETWEEN '6/1/2012' AND '6/30/2013' AND 
     FirstResponse != '' AND 
     LastResponse != '' AND 
     FirstResponse < LastResponse 
GROUP BY SUBSTRING(CONVERT(VARCHAR(11), Date_Sent, 113), 4, 8), 
     CONVERT(VARCHAR(7), Date_Sent, 120) 
ORDER BY SUBSTRING(CONVERT(VARCHAR(11), Date_Sent, 113), 4, 8) 

我能够得到这个抽样结果:

TotalQueries  Month Month_Order 
    655  Jun 2013  06 
    289  May 2013  05 

不过,我不不知道如何获得其他人:(我知道我可以通过DateDiff计算出这些值,但是我需要的是每个月符合这些特定标准的查询数。我需要这个:

TotalQueries 2Hrs 24Hrs 48Hrs 72Hrs 96Hrs Month  Month_Order 
    655  300 190 80  55  30 Jun 2013  06 
    289  180  50 30  15  14 May 2013  05 

我不熟悉复杂的SQL,所以我不确定这是否可行。

+0

您如何定义“回复”:最后一次回复和第一次回复之间的时间,或发送日期和第一次回复之间的时间? –

+0

你试图在SQL中完成所有的任何理由?你可以用代码撤回记录集和切片/骰子吗? – David

+0

@StasYarkin感谢您的回应:)时间回复是在发送日期和第一个回复之间:)基本上,我正在计算我们的专家如何快速响应个别查询。 – Poch

回答

3

尝试这样的事情

SELECT Count(Date_Sent) AS TotalQueries, 
    SUBSTRING(CONVERT(VARCHAR(11), Date_Sent, 113), 4, 8) AS Month, 
    RIGHT(CONVERT(VARCHAR(7), Date_Sent, 120), 2) AS Month_Order , 
    SUM(CASE WHEN DATEDIFF(HOUR, FirstResponse, LastResponse) < 2 THEN 1 ELSE 0 END) AS LessThan2Hours, 
    SUM(CASE WHEN DATEDIFF(HOUR, FirstResponse, LastResponse) between 2 AND 24 THEN 1 ELSE 0 END) AS LessThan24Hours, 
    SUM(CASE WHEN DATEDIFF(HOUR, FirstResponse, LastResponse) between 25 AND 48 THEN 1 ELSE 0 END) AS LessThan24Hours, 
    SUM(CASE WHEN DATEDIFF(HOUR, FirstResponse, LastResponse) between 25 AND 48 THEN 1 ELSE 0 END) AS LessThan48Hours, 
    SUM(CASE WHEN DATEDIFF(HOUR, FirstResponse, LastResponse) between 49 AND 72 THEN 1 ELSE 0 END) AS LessThan72Hours, 
    SUM(CASE WHEN DATEDIFF(HOUR, FirstResponse, LastResponse) between 73 AND 96 THEN 1 ELSE 0 END) AS LessThan96Hours 

FROM AskAO.dbo.AskAO_Stats 
WHERE Date_Sent BETWEEN '6/1/2012' AND '6/30/2013' AND FirstResponse != '' AND LastResponse != '' AND FirstResponse < LastResponse 
GROUP BY SUBSTRING(CONVERT(VARCHAR(11), Date_Sent, 113), 4, 8), CONVERT(VARCHAR(7), Date_Sent, 120) 
ORDER BY SUBSTRING(CONVERT(VARCHAR(11), Date_Sent, 113), 4, 8) 
+0

请注意,datediff在时间跨度边界上起作用,而不是单位的精确差异 - 所以在01: 59:59和03:00:00将返回2,尽管两次之间只有1小时1分钟的时间。在几秒内使用datediff(并将值范围乘以3600)应该更准确。 –

+0

@MarkBannister。好点,我错过了,谢谢 –

+0

伙计们,非常感谢你的这个!!!!!我已经能够通过你们给出的代码创建表格了! :) 谢谢你,谢谢你,谢谢你!!!! :) – Poch

1

点是唯一的COUNT()统计未出现空值。所以你可以根据你的逻辑在COUNT(...)之内写一些表达式,当你不想总结行时它等于null,否则不为null。例如,要计算少于两小时的响应数,您可以编写:

COUNT(CASE WHEN DATEDIFF(HOUR, Date_Sent, FirstResponse) < 2 THEN Date_Sent ELSE NULL END) AS [2Hrs] 

您可以执行所有其他相似的情况。