2017-09-14 81 views
0

我有一個查詢,得到正確的團隊和人數的數量的總和和計數的事件。但是,可以在上一個日期的同一位置的多個事件,所以我試圖在單日單個位置來獲得人的所有事件總數的總和。 這裏是我目前使用的查詢:SQL總和多行不集團通過

SELECT 
loc_name, 
eventDate, 
COUNT(t_ID) as Number_of_Teams, 
SUM(NbrOfPeople) as Number_of_People 
FROM tblEventDate 
WHERE 
eventID = 1 
and eventDate >='09/01/2013' 
GROUP BY loc_name, eventDate 
ORDER BY eventDate, loc_name 

的樣本數據集看起來像這樣

loc_name |eventDate |Number_of_Teams |Number_of_people 
TCC  |2013-09-04|12    |38 
SMF  |2013-09-04|8    |12 

這個查詢,但是,只有讓我的團隊和個人的數字,其中EVENTID = 1。我需要能夠得到一個總和,其中EVENTID IN(1,2,3,4,5)(最多每人每天5次位置的事件),而不必包括EVENTID在GROUP BY子句。我有點難住。

我已經試過CASE WHEN表達式,但需要在EVENTID通過最終分離這樣的數據集的價值GROUP。

loc_name |eventDate |eventID |Number_of_Teams |Number_of_people 
TCC  |2013-09-04|1  |12    |38 
TCC  |2013-09-04|2  |9    |22 
SMF  |2013-09-04|1  |8    |12 
SMF  |2013-09-04|2  |4    |9 
SMF  |2013-09-04|3  |13    |31 

我也嘗試了嵌套SELECT語句,但那是一個卑鄙的失敗。 :-)

最後,我需要一個數據集,看起來像:

loc_name |eventDate |Number_of_Teams |Number_of_people 
TCC  |2013-09-04|21    |60 
SMF  |2013-09-04|25    |52 

注意,Number_of_Teams在所有事件的所有球隊在當日位置的完整計數和NUMBER_OF_PEOPLE是當天所有賽事中所有隊員的全部總和。

任何想法將不勝感激。

+1

那麼'WHERE eventID IN(1,2,3,4,5)'而不是'WHERE eventID = 1'怎麼辦? –

+1

哦,天啊。我在這個問題上回答了我自己的血腥問題。這個答案非常簡單,我一直在面對着我。 謝謝,胡安。 – crazybobcat

+0

[談話的第一鴨(https://blog.codinghorror.com/rubber-duck-problem-solving/)爲贏!(你有沒有問過這個問題) – xQbert

回答

0

好看起來像我的意見已經解決,但我已經這樣做的情況下,問題是你不知道什麼是event_id每個日期

訣竅是選擇最多5個事件從各loc_name, eventDate在這種情況下,我選擇與更多的球隊的人。你可以自由地添加你想要的任何過濾器。

with cte as ( 
     SELECT *, ROW_NUMBER() OVER (PARTITION BY loc_name, eventDate 
            ORDER BY Number_of_Teams DESC) as rn 
     FROM tblEventDate 
     WHERE eventDate >='09/01/2013' 
) 
SELECT loc_name, 
     eventDate, 
     COUNT(t_ID) as Number_of_Teams, 
     SUM(NbrOfPeople) as Number_of_People 
FROM cte 
WHERE rn <= 5 
GROUP BY loc_name, eventDate 
ORDER BY eventDate, loc_name 
0

如果2012+,您可以使用窗口函數SUM()超過()

Select Distinct 
     loc_name 
     ,eventDate  = max(eventDate)  over (Partition By loc_name) 
     ,Number_of_Teams = sum(Number_of_Teams) over (Partition By loc_name) 
     ,Number_of_people = sum(Number_of_people) over (Partition By loc_name) 
From YourTable 
Where eventDate>='2013-09-01' 

返回

loc_name eventDate Number_of_Teams Number_of_people 
SMF   2013-09-04 25    52 
TCC   2013-09-04 21    60 
+0

我想你還需要'通過eventDate'進行分區,但是不知道爲什麼這會比group更好。 –

+0

@JuanCarlosOropeza更新與max(eventDate)假設OP要通知 –

+0

我看到如何改善答案。但是您仍然爲累積的MAX()工作添加一些'ORDER BY'。 –

0

你應該只改變你的where子句

SELECT 
loc_name, 
eventDate, 
COUNT(t_ID) as Number_of_Teams, 
SUM(NbrOfPeople) as Number_of_People 
FROM tblEventDate 
WHERE 
eventID IN (1,2,3,4,5) 
and eventDate >='09/01/2013' 
GROUP BY loc_name, eventDate 
ORDER BY eventDate, loc_name