2017-11-17 9 views
0

この数の平均を取得するにはどうすればよいですか?Microsoft SQL Server 2008でカウントの平均を取得するには

SELECT 
    driver, 
    COUNT(order_number) as month_total 
FROM 
    Unloads 
WHERE 
    completiondate BETWEEN '11-06-2017' AND '11-10-2017' 
GROUP BY 
    driver 
ORDER BY 
    month_total DESC; 
+0

'SELECT AVG(...)'をラップするだけですか?この場合CTEを使用することができます(一般的な習慣の場合のみ、そうでない場合はネストされたSELECTはOKです)。 –

+0

'AVG(COUNT(order_number))OVER()をavgtotal'として追加するだけで、出力をどのように見えるかに応じて動作するはずです。 – ZLK

+0

これは本当に興味深い日付範囲です、それはmm-dd-yyyyかdd-mm-yyyですか?なぜ11日? (またはそれはちょうど数日です)あなたは4ヶ月を期待していますか?彼らはすべて11日に開始する予定ですか?期間は「間は悪い」と言います。 –

答えて

0

あなたは日 - によってドライバの平均をしたい場合は、渡された日数で各ドライバーのカウントを副問合せと分けることができます。渡された日数は、2つの日付に1日を加えた日付です。それはあなたが包括的であるBETWEENを使用してからプラス1日です。 IOW、6日目、7日目、8日目、9日目、10日目。これは5日間です。しかしdatediff(DAY, '2017-11-06', '2017-11-10')はわずか4日です。正しい日数で割りるには+1日を追加する必要があります。だから、アルゴリズムは次のようになります:

SELECT dT.driver 
     ,month_total/(DATEDIFF(DAY, '2017-11-06', '2017-11-10') + 1) [Daily Driver Avg] 

    FROM (
     SELECT 
      driver, 
      COUNT(order_number) as month_total 
     FROM 
      Unloads 
     WHERE 
      completiondate BETWEEN '2017-11-06' AND '2017-11-10' 
     GROUP BY 
      driver 
     ) AS dT 
0

は、私はあなたがそれはあまりにも、作品

SELECT 
    driver, 
    month_total, 
    AVG(month_total)OVER() avg_of_month_total 
FROM 
    (
    SELECT 
     driver, 
     COUNT(order_number) as month_total 
    FROM Unloads 
    WHERE completiondate BETWEEN '11-06-2017' AND '11-10-2017' 
    GROUP BY driver 
) q 

各列の平均額を表示したい場合は

SELECT AVG(month_total) 
FROM 
    (
    SELECT 
     driver, 
     COUNT(order_number) as month_total 
    FROM Unloads 
    WHERE completiondate BETWEEN '11-06-2017' AND '11-10-2017' 
    GROUP BY driver 
) q 

または(からのコメントを参照してくださいサブクエリを使用することができると思います@ ZLK)

SELECT 
    driver, 
    COUNT(order_number) as month_total, 
    AVG(COUNT(order_number))OVER() avg_of_month_total 
FROM Unloads 
WHERE completiondate BETWEEN '11-06-2017' AND '11-10-2017' 
GROUP BY driver 
0

しかし、時系列のデータにはギャップがある可能性があります。そのため、月ごとに確実に平均化するには、ギャップがないことを確認する必要があります。方法は(多くがあります)次のようなものを実行して、範囲が行として存在するようにしてから、それらにデータを結合します。私が特に注意するもう一つのことは、日付範囲の間に "between"を使用しないことです。以下に示すように>=<を使用すると、誤って上境界日に座っているデータが数えきれないほど大きくなることはありません。

declare @start_dt date; 
set @start_dt = '20170601'; 

select 
     u.driver, period_start_dt, period_end_dt 
    , count(completiondate)   montly_count 
    , AVG(COUNT(completiondate))OVER() avg_montly_count 
from (
     select 
       dateadd(month,m.n,start_dt) period_start_dt 
      , dateadd(month,m.n+1,start_dt) period_end_dt 
      , m.n       month_no 
     from (
       select @start_dt start_dt) seed 
     cross join (select 0 n union all 
        select 1 union all select 2 union all select 3 union all 
        select 4 union all select 5 union all select 6 union all 
        select 7 union all select 8 union all select 9 union all 
        select 10 union all select 11 
        ) m 
    ) r 

-- LEFT JOIN YOUR DATA 
LEFT JOIN unloads u on u.completiondate >= r.period_start_dt and u.completiondate < r.period_end_dt 

WHERE period_start_dt >= '20170601' and period_start_dt < '20171001' 

group by 
     u.driver , period_start_dt, period_end_dt  
order by 
     period_start_dt, u.driver 

Demo

関連する問題