2017-09-14 200 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