2017-08-30 18 views
0

コールセンター内のコールの量について、6週間の移動平均を同じ曜日に計算しています。6週間同じ曜日に移動平均

私はこれの意味することは、私が働いて、次のコードを持っている

同じ6前の日(最後の6火曜日、最後の6つの水曜日、など)ではなく、柔軟ですべて:

SELECT 
    [ROW_DATE], 
    [DEPARTMENT_DESC], 
    [totalcalls], 
    AVG([TOTALCALLS]) OVER(ORDER BY [DEPARTMENT_DESC], 
            [ROW_DATE] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [MOVING_AVG] 
FROM 
(
    SELECT 
     [ROW_DATE] AS [ROW_DATE], 
     [DEPARTMENT_DESC] AS [DEPARTMENT_DESC], 
     SUM([CALLS_OFFERED_ACTUALS]) AS [TOTALCALLS] 
    FROM [GEMDB].[dbo].[V_PRD_ACT_HSPLIT_intradayLCWcallsTable] 
    WHERE ROW_DATE IN(CONVERT(DATE, GETDATE() - 42), CONVERT(DATE, GETDATE() - 7), CONVERT(DATE, GETDATE() - 14), CONVERT(DATE, GETDATE() - 21), CONVERT(DATE, GETDATE() - 28), CONVERT(DATE, GETDATE() - 35)) 
    AND [DEPARTMENT_DESC] = 'techops' 
    GROUP BY 
     ROW_DATE, 
     [DEPARTMENT_DESC] 
) AS tbl 
ORDER BY 
    ROW_DATE, 
    [DEPARTMENT_DESC]; 

出力は次のようになります。 Moving Average for August 23rd

上記のコードの問題は、それが私の週(8月23日)の1日の値を与えるです。 GETDATEを49回書くことなく、過去7日間の6週間の移動平均を取得したいと思います。これは夢中になります。

ご協力いただければ幸いです。

+0

はあなたが表示されことができます...それはあなたの条件に合うかどうかをテストし、適応するために単独でこのコードを実行することができます模擬Excelのシートや何かのように、期待される出力はどのように見えるでしょうか? –

答えて

0

私は正しく理解しているかどうかを尋ねている簡単な例を作成しようとしました。これは2週間分のデータを使用しますが、より大きいデータセットでは機能します。

CREATE TABLE #calls 
(
    TotalCalls INT, 
    CallDate DATE 
); 

-- 2 weeks worth of calls 
INSERT INTO #calls 
(
    TotalCalls, 
    CallDate 
) 
VALUES 
(12, '20170801'), -- starts on a Tuesday 
(13, '20170802'), 
(17, '20170803'), 
(20, '20170804'), 
(4, '20170805'), 
(8, '20170806'), 
(10, '20170807'), 
(14, '20170808'), 
(18, '20170809'), 
(16, '20170810'), 
(7, '20170811'), 
(11, '20170812'), 
(19, '20170813'), 
(14, '20170814'); 

-- casts to numeric with decimal places for the average for accuracy 
-- DayName - gives the day names for grouping 
-- DayNo - gives you the day number for ordering 
-- Instances - gives you how many days were included in the average 
-- WHERE - filters to dates >= date - 42 for 6 weeks 
SELECT AVG(CAST(c.TotalCalls AS NUMERIC(5,2))) AvgCalls, 
     DATENAME(dw,c.CallDate) DayName, 
     DATEPART(dw, c.CallDate) DayNo, 
     COUNT(c.CallDate) Instances 
FROM #calls AS c 
WHERE c.CallDate > GETDATE() - 42 
GROUP BY DATENAME(dw, c.CallDate), DATEPART(dw, c.CallDate) 
ORDER BY DATEPART(dw, c.CallDate) 

が生成されます:ここで

AvgCalls DayName DayNo Instances 
13.500000 Sunday  1  2 
12.000000 Monday  2  2 
13.000000 Tuesday 3  2 
15.500000 Wednesday 4  2 
16.500000 Thursday 5  2 
13.500000 Friday  6  2 
7.500000 Saturday 7  2 
+1

どのようなシンプルでスムーズなソリューション。これは完璧に動作します。タナーありがとう! –

0

別のオプションです

WITH 
    cte_SixWeekCal AS (
     SELECT 
      c.WEEK_NO, 
      ROW_DATE_BEG = DATEADD(WEEK, -13 + c.WEEK_NO, CAST(GETDATE() AS DATE)), 
      ROW_DATE_END = DATEADD(WEEK, -7 + c.WEEK_NO, CAST(GETDATE() AS DATE)) 
     FROM 
      (VALUES (1), (2), (3), (4), (5), (6)) c (WEEK_NO) 
     ) 
SELECT 
    swc.WEEK_NO, 
    ROW_DATE = ROW_DATE_END, 
    ahid.DEPARTMENT_DESC. 
    ahid.MOVING_AVG 
FROM 
    cte_SixWeekCal swc 
    CROSS APPLY (
       SELECT 
        ahi.DEPARTMENT_DESC, 
        MOVING_AVG = AVG(ahi.CALLS_OFFERED_ACTUALS) 
       FROM 
        [GEMDB].dbo.V_PRD_ACT_HSPLIT_intradayLCWcallsTable ahi 
       WHERE 
        ih.InvoiceDate >= swc.ROW_DATE_BEG 
        AND ih.InvoiceDate <= swc.ROW_DATE_END 
       GROUP BY 
        ahi.DEPARTMENT_DESC 
       ) ahid; 
関連する問題