2013-10-30 89 views
0

我每天的事件列表如下:分區SUM和COUNT

EventTypeID INT (multiple events, not unique) 
EventDate (cast(EventDate) as Date) 
HeadCount INT 

我需要製作這樣的:

EventDate, AvgHeadCountET, AvgHeadCountTotal 

如果每一天,我都按事件類型,平均的平均員工人數HeadCount當天的所有活動。

我已經完成了這個使用#TempTables幾次傳遞,但我不禁想到有一個更有效的方式來做到這一點。

+0

每個事件類型的輸出平均計數?由於每個事件類型一列?每個事件的日期和事件 – Szymon

+0

一行類型。換句話說,GROUP BY EventDate,EventType。還需要按日期爲單個EventType生成這個,但這與使用where子句幾乎完全相同。 – Metaphor

回答

1

要做到這一點,你需要明確地計算平均 - 也就是說,採取的總和除以計:

SELECT EventDate,EventTypeID, 
     AVG(HeadCount) AS AvgHeadCountET, 
     (sum(sum(HeadCount)) over (partition by EventDate)/
     count(*) over (partition by EventDate) 
     ) as AvgHeadCountTotal 
FROM t 
GROUP BY EventDate, EventTypeID; 

混合窗函數和聚集功能並導致時髦的語法(如sum(sum()),但他們在一起你想怎麼工作。

Here是SQLFiddle對其進行說明。

+0

謝謝!這工作完美。 – Metaphor

1

是這樣的:

SELECT EventDate,EventTypeID 
    , AVG(HeadCount) AS AvgHeadCountET 
    --, AVG(AVG(HeadCount)) OVER (PARTITION BY EventDate) AS AvgHeadCountTotal 
    , SUM(SUM(HeadCount)) OVER (PARTITION BY EventDate)/COUNT(*) OVER (PARTITION BY EventDate) AS AvgHeadCountTotal 
FROM YourTable 
GROUP BY EventDate,EventTypeID 

AVGHeadCountTotal值將被跨越記錄重複用於每個EVENTDATE在上述。

+0

我收到一條錯誤消息:HeadCount在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。 – Metaphor

+0

我的哎呀,看到更新。 –

+0

這會運行,但會產生錯誤的結果。一般來說,我不認爲平均值的平均值是有效的。我雖然嘗試過,結果不對。 – Metaphor