2

終了しようとしているプログラムに問題があります。3 つのタイムスタンプを格納するテーブルがあります。クエリと応答の統計を作成するために使用されます。最初のタイムスタンプはクエリの日時 (Date_Sent) で、残りの 2 つは、専門家の 1 人がクエリに初めて応答したとき (FirstResponse) と、そのクエリが満たされたとき (LastResponse) です。次の基準に基づいてグラフを作成することになっています。

  1. 1 か月あたりの合計クエリ数
  2. 2 時間以内に応答したクエリの数
  3. 24 時間未満で 2 時間以上応答したクエリの数
  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 に慣れていないので、これが実行可能かどうかわかりません。

4

2 に答える 2

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)
于 2013-07-04T07:32:59.073 に答える
1

ポイントはCOUNT()、null ではない値のみをカウントすることです。したがってCOUNT(...)、ロジックに従って、行を合計したくない場合は null に等しく、それ以外の場合は null に等しくない式を記述することができます。たとえば、2 時間以内の応答数をカウントするには、次のように記述できます。

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

他のすべてのケースも同様に行うことができます。

于 2013-07-04T07:37:01.940 に答える