2013-07-04 123 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] 

您可以執行所有其他相似的情況。